我有以下课程:
class CObj {
private:
MyOtherClass _member;
};
以及创建CObj类实例的以下代码:
CObj* obj = new Cobj;
obj是在堆上分配的,但是:CObj :: _成员也是在堆上分配的吗?还是在堆栈上?
答案 0 :(得分:4)
obj
是“在堆栈上”分配的指针;对象obj
指向的是“在堆上”,并且,obj->_member
是这样一个对象的成员(=一部分),它也在堆上。
通常,作为父对象一部分的成员将在其父项存储的任何位置进行分配。
答案 1 :(得分:3)
_member
具有自动存储持续时间 - 在分配拥有对象的位置分配。因此,如果您使用动态存储持续时间创建CObj
的实例,就像在您的示例中一样,它也将在动态存储(堆)中分配。如果您创建一个具有自动存储持续时间的对象,它将在堆栈中。
这些问题的问题在于C ++没有 stack 和 heap 的任何概念 - 它只是storage durations。
答案 2 :(得分:0)
当你调用new
OS时,在堆上调用类的大小和调用类的构造函数。
从此可以看出,由于MyOtherClass
位于CObj
而CObj
位于MyOtherClass
,MyOtherClass
也位于与{{相同的空间中的堆上1}}。