我有一个班级
class Sample
{
string strName;
};
如果我使用Sample *obj = new Sample()
为Sample创建一个对象,那么字符串strName
在哪里创建?它是堆栈还是堆中?
答案 0 :(得分:4)
无处,因为Sample obj = new Sample()
无法编译。
如果您的意思是Sample* obj = new Sample()
,那么它就在动态存储(堆)中。
当你致电delete obj
时,字符串将被自动删除,即使它在堆上。
答案 1 :(得分:2)
整个og obj
位于“堆”上,其数据成员也是如此。但是,您不必担心管理分配给数据成员的内存。删除obj
也会处理字符串。
答案 2 :(得分:1)
无论在何处分配类,都将使用类创建结构,数组,指针和基本数字类型。
字符串更复杂。它们是一种容器。定义容器的字符串成员将作为样本类中的成员存储在类的内存块中。 String的文本可能会被分配到堆上的其他位置(取决于字符串类实现)。
现在,如果你执行Sample* blah = new Sample();
,那么operator new将在堆中分配内存(指针将在堆栈上,或者如果它最初是堆上类的成员则在堆上)。 />
如果您只是将其用作变量,它将存储在堆栈中:Sample blah;
答案 3 :(得分:1)
strName
将放置在Sample
对象的放置位置。但是,类string
可以根据需要设置任何存储,无论是否使用正常变量(然后它们被放置在放置string
的地方,指向某些内容,内存映射,始终是只是从地球的另一端查询XML接口。
但是,string
必须以某种方式存储地址,例如它的指针或引用或URL或使用的任何寻址方案都放在string
所在的位置。
相关经验法则:指针本身就是值(这就是在对象复制情况下难以正确处理的原因)。