给出以下代码:
class MyClass
{
public:
char array[10];
};
int main()
{
MyClass *p = new MyClass;
...
}
据我所知 - new在堆上分配对象。 但是,数组也在堆栈上分配(没有新的运算符)。
那么,是在堆上分配数组(因为对象在堆中)还是在程序堆栈上?
答案 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
的每个成员。类的大小基于它的成员。 array
是MyClass
的成员,因此MyClass
在免费商店中分配,array
也是如此。