我有一个类分配类中的成员变量在哪里?
class Sample
{
string strName;
};
如果我创建使用Sample *obj = new Sample()
哪里串strName
创建示例对象?它是堆栈还是堆?
我有一个类分配类中的成员变量在哪里?
class Sample
{
string strName;
};
如果我创建使用Sample *obj = new Sample()
哪里串strName
创建示例对象?它是堆栈还是堆?
没有,因为Sample obj = new Sample()
不会编译。
如果您的意思是Sample* obj = new Sample()
,那么它是在动态存储(堆)中。
当您拨打delete obj
时,即使它位于堆上,字符串也会自动删除。
对不起编辑我的帖子 – Jeeva 2012-07-05 11:05:58
@Jeeva答案仍然适用。 – 2012-07-05 11:06:23
整个og obj
在“堆”上,其数据成员也是如此。但是,您不必担心管理分配给数据成员的内存。删除obj
也会照顾字符串。
“堆”:)) – 2012-07-05 11:07:36
无论分配哪个类,都会使用该类创建结构体,数组,指针和基本数值类型。
字符串更复杂。它们是一种容器。定义容器的字符串成员将作为样例类中的成员存储在类的内存块中。字符串的文本可能会被分配到堆上的其他地方(取决于字符串类的实现)。
现在,如果你做Sample* blah = new Sample();
那么operator new将在堆中分配内存(如果指针最初是堆中类的成员,则指针将位于堆栈上或堆上)。
如果你只是把它作为一个变量,它会被存储在堆栈上:Sample blah;
*现在,如果你做Sample * blah = new Sample();那么operator new将在堆中分配内存(指针将在堆栈中)。*如果指针是在堆本身上创建的类的成员,则不适用! ** Heapception ** – 2012-07-05 11:14:46
没错。补充说。很难想到每一个例子,当试图彻底:) – 2012-07-05 11:17:37
strName
将被放置在您的Sample
对象放置。然而,类string
可能会引用它所喜欢的任何存储,是否使用正常变量(然后再将它们放在放置位置的地方,指向某些东西的指针(内存映射)始终只是从其他位置查询XML接口地球的一侧。
然而,string
具有以某种方式存储地址,因此,例如其的指针或引用或网址或任何寻址方案被使用,置于其中string
放置。
相关经验法则:指针本身的价值(我为什么在对象复制情况下很难正确处理)。
C++标准没有定义“堆栈”和“堆”,因此理论上它取决于编译器,只要保留生命周期语义。而且,'std :: string'可以在任何想要的地方保存它的实际数据。 – Vlad 2012-07-05 11:15:23