c ++堆或堆栈分配?

时间:2012-05-14 16:55:30

标签: c++ memory stack heap

所以基本上这是一个堆栈分配:

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的10byte长内容是在Heap而不是Stack中分配的

3 个答案:

答案 0 :(得分:15)

它将被分配在对象内部,因此如果对象在堆上,则数组将在堆上;如果对象在堆栈上,则数组将在堆栈中;如果对象在可执行文件的静态内存中,那么数组也会存在。

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

答案 1 :(得分:5)

如果MyClasschar test[10]成员,则会按相同的方式分配MyClass的实例。

MyClass mc; //mc.test is on the stack
MyClass * mcp = new MyClass; //mcp->test is on the heap

答案 2 :(得分:2)

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