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

时间:2015-11-30 11:18:41

标签: c++ memory-management

如果在堆上分配了一个类,那么在该类中分配的所有内容是在堆上还是仅在其成员变量上?例如:

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,这是真的吗?

1 个答案:

答案 0 :(得分:3)

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

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

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

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