C++堆还是栈分配?

5
这是一个栈分配的变量:
char inStack[10]; 
// and 
MyStruct cl;

这应该被分配在堆中:

char* inHeap = new char[10];
// and
MyClass cl = new MyClass();

如果 MyClass 包含一个 char test[10] 变量,那么会怎样呢?下面的代码:
MyClass cl = new MyClass()

这是否意味着MyClass::test的10字节内容是在堆上而不是栈上分配的?

3个回答

15

数组会被分配在对象内部,所以如果对象在堆上,数组也会在堆上;如果对象在栈上,数组也会在栈上;如果对象在可执行文件的静态内存中,数组也会在那里。

C++中,对象的成员是对象本身的一部分。如果你有对象的地址和大小,那么你就知道该类的所有成员都在范围 [address, address + size) 内的某个地方,不管这个地址实际上在内存的哪个位置(堆、栈等)。


也许吧,我想我会删除这个语句以免引起任何混淆。 - Alok Save

5
如果MyClass有一个char test[10]成员,则将以与MyClass的实例分配方式相同的方式进行分配。
MyClass mc; //mc.test is on the stack
MyClass * mcp = new MyClass; //mcp->test is on the heap

2

语言中正确的术语是自动动态存储,这比堆栈更有意义。特别是自动存储不一般意味着堆栈,只是在函数的局部变量中,但正如您所提到的,如果您正在定义类的成员,则自动存储将位于封闭对象所在的位置,可以是堆栈、堆或静态对象。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接