gpt4 book ai didi

c++ - 具体哪些对象会分配到堆上?

转载 作者:行者123 更新时间:2023-11-30 02:35:05 25 4
gpt4 key购买 nike

如果一个类是在堆上分配的,那么在该类中分配的所有东西都会在堆上还是只在它的成员变量上?例如:

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 及其所有成员数据具有自动存储持续时间,因此如果您尝试存储指针或对它的引用,您会深入到未定义行为的深处,因为当构造函数退出时内存将被回收。

关于c++ - 具体哪些对象会分配到堆上?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33997367/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com