这是堆栈上的分配:
char inStack[10];
// and
MyStruct cl;
这应该在堆中分配:
char* inHeap = new char[10];
// and
MyClass cl = new MyClass();
如果MyClass
包含char test[10]
变量怎么办?做这个:
MyClass cl = new MyClass()
...意味着 10 字节长的内容MyClass::test
是在堆而不是堆栈中分配的?
这是堆栈上的分配:
char inStack[10];
// and
MyStruct cl;
这应该在堆中分配:
char* inHeap = new char[10];
// and
MyClass cl = new MyClass();
如果MyClass
包含char test[10]
变量怎么办?做这个:
MyClass cl = new MyClass()
...意味着 10 字节长的内容MyClass::test
是在堆而不是堆栈中分配的?
它将在对象内部分配,因此如果对象在堆上,则数组将在堆上;如果对象在堆栈上,则数组将在堆栈上;如果对象在可执行文件的静态内存中,则数组也将在那里。
在 C++ 中,对象的成员是对象本身的一部分。如果你有对象的地址和它的大小,你就知道类的所有成员都将在 range 内的某个[address, address + size)
位置,无论该地址实际在内存中的哪个位置(堆、堆栈等)。
如果MyClass
有一个char test[10]
成员,它将以与分配实例相同的方式MyClass
分配。
MyClass mc; //mc.test is on the stack
MyClass * mcp = new MyClass; //mcp->test is on the heap
语言中的正确术语是自动和动态存储,这些比stack和heap更有意义。特别是自动存储通常并不意味着堆栈,仅在函数中的局部变量中,但正如您提到的,如果您定义一个类的成员,自动存储将在封闭对象所在的任何位置,可以是堆栈,堆或静态对象。