如果在堆上分配了一个类,那么在该类中分配的所有内容是在堆上还是仅在其成员变量上?例如:
class OnStackB {
int Value;
};
class OnStackA {
OnStackB Class;
};
class OnHeap {
OnHeap(){
OnStackA StackA;
}
OnStackB StackB;
};
int main(){
OnHeap* Heap = new OnHeap();
}
我理解Heap
将在堆上分配,
Heap->StackB
将在堆上,但是Heap->StackB.Value
会在堆栈还是堆上?
分配StackA
时,看起来好像它会在堆栈上以及StackA.Class
和StackA.Class.Value
,这是真的吗?
答案 0 :(得分:3)
首先,术语stack
和heap
没有像您认为的那样在C ++中定义。该标准在存储持续时间而非分配区域方面对分配和谈判非常不了解。当您说“在堆栈上分配”时,您实际上是指自动存储持续时间,这可能涉及堆栈分配,寄存器分配或无分配(优化输出)。当你说“在堆上分配”时,你的意思是动态存储持续时间,这可能涉及在免费商店上的分配(这就像堆概念的抽象)。
有了这些条款,我们可以更准确地了解这里发生的事情。
对象的存储持续时间适用于该对象的所有非静态成员数据。因此,如果您的Heap
对象具有动态存储持续时间,StackB
成员及其Class
成员也将如此。它可能包含指向具有不同存储持续时间的内容的指针,但数据成员的生命周期直接与对象的生命周期相关联。
在OnHeap
构造函数中,StackA
具有自动存储持续时间及其所有成员数据,因此如果您尝试存储指针或引用,则可以深入到未定义的行为,因为当构造函数退出时将回收内存。