[英]Specifically which objects will be allocated on the heap?
如果在堆上分配了一个类,那么在该类中分配的所有内容是在堆上还是仅在其成员变量上? 例如:
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
,这是真的吗?
首先,术语stack
和heap
没有按照您认为的方式在C ++中定义。 该标准在存储持续时间而非分配区域方面对分配和会话非常不了解。 当您说“在堆栈上分配”时,您实际上意味着自动存储持续时间 ,这可能涉及堆栈分配,寄存器分配或无分配(优化输出)。 当你说“在堆上分配”时,你的意思是动态存储持续时间 ,这可能涉及在免费存储上的分配(这就像堆概念的抽象)。
有了这些条款,我们可以更准确地了解这里真正发生的事情。
对象的存储持续时间适用于该对象的所有非静态成员数据。 因此,如果您的Heap
对象具有动态存储持续时间,则StackB
成员及其Class
成员也是如此。 它可以包含指向具有不同存储持续时间的内容的指针,但数据成员的生命周期直接与对象的生命周期相关联。
在OnHeap
构造函数中, StackA
具有自动存储持续时间及其所有成员数据,因此如果您尝试存储指针或引用,那么您将深入到未定义行为的深度,因为构造函数将回收内存退出。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.