这些堆栈分配或堆分配?
可能重复:
这种类型的内存是否被分配到堆或栈上?
class foo{
private:
int bar;
constructors and other members here...
}
如果我使用新操作符创建foo
的实例,它将在哪里创建?
堆我猜,但我的int bar;
在哪里int bar;
获得创建,堆栈或堆?
如果我的bar
不是一个原始的数据类型,但另一个对象创建像这样 - this->bar=bar();
,它会在哪里创建?
阅读内存中如何构造类实例。 这里简单的解释 。
成员是内存中类实例块的一部分。 因此,只要分配了类实例,就可以分配整个块,包括成员。
既然你已经在堆中创建了foo
,所有的成员变量primitive / non-primitive也会在堆中。
情况1:
Foo *obj = new Foo();
酒吧在堆上:
案例2:
Foo obj ;
酒吧在堆栈上:
根据标准
3.7.4子对象的持续时间[basic.stc.inherit]
成员子对象,基类子对象和数组元素的存储持续时间是其完整对象(1.8)的存储持续时间。
任何自动(不是用new
创建的)对象/值都是在其容器对象内创建的。 如果它们是独立的,它们将在堆栈中创建。
在这种情况下, bar
将在其容器对象内创建,这是在堆中创建的foo
实例。 所以bar
会去foo
实例中的堆。