2012-07-05 58 views
0

我有一个类分配类中的成员变量在哪里?

class Sample 
{ 
    string strName; 
}; 

如果我创建使用Sample *obj = new Sample()哪里串strName创建示例对象?它是堆栈还是堆?

+0

C++标准没有定义“堆栈”和“堆”,因此理论上它取决于编译器,只要保留生命周期语义。而且,'std :: string'可以在任何想要的地方保存它的实际数据。 – Vlad 2012-07-05 11:15:23

回答

4

没有,因为Sample obj = new Sample()不会编译。

如果您的意思是Sample* obj = new Sample(),那么它是在动态存储(堆)中。

当您拨打delete obj时,即使它位于堆上,字符串也会自动删除。

+0

对不起编辑我的帖子 – Jeeva 2012-07-05 11:05:58

+0

@Jeeva答案仍然适用。 – 2012-07-05 11:06:23

2

整个og obj在“堆”上,其数据成员也是如此。但是,您不必担心管理分配给数据成员的内存。删除obj也会照顾字符串。

+0

“堆”:)) – 2012-07-05 11:07:36

1

无论分配哪个类,都会使用该类创建结构体,数组,指针和基本数值类型。

字符串更复杂。它们是一种容器。定义容器的字符串成员将作为样例类中的成员存储在类的内存块中。字符串的文本可能会被分配到堆上的其他地方(取决于字符串类的实现)。

现在,如果你做Sample* blah = new Sample();那么operator new将在堆中分配内存(如果指针最初是堆中类的成员,则指针将位于堆栈上或堆上)。
如果你只是把它作为一个变量,它会被存储在堆栈上:Sample blah;

+0

*现在,如果你做Sample * blah = new Sample();那么operator new将在堆中分配内存(指针将在堆栈中)。*如果指针是在堆本身上创建的类的成员,则不适用! ** Heapception ** – 2012-07-05 11:14:46

+0

没错。补充说。很难想到每一个例子,当试图彻底:) – 2012-07-05 11:17:37

1

strName将被放置在您的Sample对象放置。然而,类string可能会引用它所喜欢的任何存储,是否使用正常变量(然后再将它们放在放置位置的地方,指向某些东西的指针(内存映射)始终只是从其他位置查询XML接口地球的一侧。

然而,string具有以某种方式存储地址,因此,例如其的指针或引用或网址或任何寻址方案被使用,置于其中string放置。


相关经验法则:指针本身的价值(我为什么在对象复制情况下很难正确处理)。