在堆上或堆栈上的指针类实例中分配C ++非指针数据成员

时间:2013-10-22 11:47:45

标签: c++ c pointers memory

我有以下课程:

class CObj {
private:
    MyOtherClass _member;
};

以及创建CObj类实例的以下代码:

CObj* obj = new Cobj;

obj是在堆上分配的,但是:CObj :: _成员也是在堆上分配的吗?还是在堆栈上?

3 个答案:

答案 0 :(得分:4)

obj是“在堆栈上”分配的指针;对象obj指向的是“在堆上”,并且,obj->_member是这样一个对象的成员(=一部分),它也在堆上。

通常,作为父对象一部分的成员将在其父项存储的任何位置进行分配。

答案 1 :(得分:3)

_member具有自动存储持续时间 - 在分配拥有对象的位置分配。因此,如果您使用动态存储持续时间创建CObj的实例,就像在您的示例中一样,它也将在动态存储(堆)中分配。如果您创建一个具有自动存储持续时间的对象,它将在堆栈中。

这些问题的问题在于C ++没有 stack heap 的任何概念 - 它只是storage durations

答案 2 :(得分:0)

当你调用new OS时,在堆上调用类的大小和调用类的构造函数。

从此可以看出,由于MyOtherClass位于CObjCObj位于MyOtherClassMyOtherClass也位于与{{相同的空间中的堆上1}}。