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