可能重复:这种类型的内存是在堆还是堆栈上分配的?
class foo{ private: int bar; constructors and other members here... }
如果我使用new运算符创建一个 foo 的实例,它将被创建?
foo
我猜,但我的 int bar; 在哪里创建,堆栈或堆?
int bar;
如果我的 bar 不是原始数据类型而是另一个像 this->bar=bar(); 创建的对象,它将在哪里创建?
bar
this->bar=bar();
在其容器对象内创建任何自动(未使用 new 创建)对象/值 . 如果它们是独立的,则它们在堆栈中创建 .
new
在这种情况下,将在其容器对象中创建 bar ,该容器对象是在堆中创建的 foo 实例 . 所以 bar 将进入 foo 实例内的堆 .
由于您在堆中创建了 foo ,因此所有成员变量primitive / non-primitive也将在堆中 .
情况1:
Foo *obj = new Foo();
bar在堆上:
案例2:
Foo obj ;
栏在堆栈上:
按照标准
3.7.4子对象的持续时间[basic.stc.inherit]成员子对象,基类子对象和数组元素的存储持续时间是其完整对象的存储持续时间(1.8) .
阅读有关如何在内存中构造类实例的信息 . Simple explanation here .
成员是类实例在内存中的块的一部分 . 因此,无论分配哪个类实例,都会分配整个块,包括成员 .
3 回答
在其容器对象内创建任何自动(未使用
new
创建)对象/值 . 如果它们是独立的,则它们在堆栈中创建 .在这种情况下,将在其容器对象中创建
bar
,该容器对象是在堆中创建的foo
实例 . 所以bar
将进入foo
实例内的堆 .由于您在堆中创建了
foo
,因此所有成员变量primitive / non-primitive也将在堆中 .情况1:
bar在堆上:
案例2:
栏在堆栈上:
按照标准
阅读有关如何在内存中构造类实例的信息 . Simple explanation here .
成员是类实例在内存中的块的一部分 . 因此,无论分配哪个类实例,都会分配整个块,包括成员 .