成员数组在哪里?

时间:2017-11-12 14:46:17

标签: c++

给出以下代码:

class MyClass
{
public:
    char array[10];
};

int main()
{
    MyClass *p = new MyClass;
...
}

据我所知 - new在堆上分配对象。 但是,数组也在堆栈上分配(没有新的运算符)。

那么,是在堆上分配数组(因为对象在堆中)还是在程序堆栈上?

2 个答案:

答案 0 :(得分:6)

  

但是,数组也在堆栈上分配(没有新运算符)

不,数组是对象的成员。这是它的一部分。如果对象是动态分配的,那么它的所有部分也是如此。

注意我说的是所有部分。我们可以调整你的例子:

class MyClass
{
public:
    char *p_array;
};

int main()
{
    char array[10];
    MyClass *p = new MyClass{array};

    // Other code
}

现在该对象包含一个指针。作为对象成员的指针是动态分配的。但它拥有的地址是一个具有自动存储持续时间的对象(数组)。

但是,现在,数组不再是对象的一部分。这种分离是使你想到的布局成为可能的原因。

答案 1 :(得分:4)

MyClass *p = new MyClass;的真正含义是您希望在堆/免费存储上分配sizeof(MyClass)个字节来存储MyClass的每个成员。类的大小基于它的成员。 arrayMyClass的成员,因此MyClass在免费商店中分配,array也是如此。