繁体   English   中英

具体哪些对象将在堆上分配?

[英]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.ClassStackA.Class.Value ,这是真的吗?

首先,术语stackheap没有按照您认为的方式在C ++中定义。 该标准在存储持续时间而非分配区域方面对分配和会话非常不了解。 当您说“在堆栈上分配”时,您实际上意味着自动存储持续时间 ,这可能涉及堆栈分配,寄存器分配或无分配(优化输出)。 当你说“在堆上分配”时,你的意思是动态存储持续时间 ,这可能涉及在免费存储上的分配(这就像堆概念的抽象)。

有了这些条款,我们可以更准确地了解这里真正发生的事情。

对象的存储持续时间适用于该对象的所有非静态成员数据。 因此,如果您的Heap对象具有动态存储持续时间,则StackB成员及其Class成员也是如此。 它可以包含指向具有不同存储持续时间的内容的指针,但数据成员的生命周期直接与对象的生命周期相关联。

OnHeap构造函数中, StackA具有自动存储持续时间及其所有成员数据,因此如果您尝试存储指针或引用,那么您将深入到未定义行为的深度,因为构造函数将回收内存退出。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM