类内的成员变量在哪里分配

Where does the member variable inside a class allocated?

本文关键字:在哪里 分配 变量 成员      更新时间:2023-10-16

我有一个类

class Sample
{
   string strName;
};

如果我使用 Sample *obj = new Sample() 为 Sample 创建一个对象,字符串strName在哪里创建? 它是在堆栈中还是在堆中?

无处可去,因为Sample obj = new Sample()不会编译。

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

当您调用 delete obj 时,该字符串将自动删除,即使它在堆上也是如此。

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

strName将被放置在放置Sample对象的位置。但是,类string可以在引擎盖下解决它喜欢的任何存储,是否使用普通变量(然后它们再次放置在放置string的位置,指向某物的指针,内存映射,一直只是从地球的另一端查询XML接口。

但是,string必须以某种方式存储地址,因此例如,它的指针或引用或URL或任何使用的寻址方案都放置在放置string的位置。


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

无论在哪里

分配类,都将使用类创建结构、数组、指针和基本数字类型。

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

现在,如果您这样做Sample* blah = new Sample();则运算符 new 将在堆中分配内存(指针将位于堆栈上,如果它最初是堆上类的成员,则指针位于堆上)。
如果您只是将其用作变量,它将存储在堆栈中:Sample blah;