C++ 具体来说,将在堆上分配哪些对象?
如果一个类是在堆上分配的,那么在该类中分配的所有内容是在堆上还是只在其成员变量上分配?例如:C++ 具体来说,将在堆上分配哪些对象?,c++,memory-management,C++,Memory Management,如果一个类是在堆上分配的,那么在该类中分配的所有内容是在堆上还是只在其成员变量上分配?例如: class OnStackB { int Value; }; class OnStackA { OnStackB Class; }; class OnHeap { OnHeap(){ OnStackA StackA; } OnStackB StackB; }; int main(){ OnHeap* Heap = new OnHea
class OnStackB {
int Value;
};
class OnStackA {
OnStackB Class;
};
class OnHeap {
OnHeap(){
OnStackA StackA;
}
OnStackB StackB;
};
int main(){
OnHeap* Heap = new OnHeap();
}
我知道堆
将在堆上分配,
Heap->StackB
将在堆上,但Heap->StackB.Value
是否在堆栈或堆上
<> > <代码> STACKA<代码>,它看起来将在堆栈上,也在<代码> STACKA。class < /COD>和
首先,术语“代码>堆栈和
堆
对象具有动态存储持续时间,那么StackB
成员及其类
成员也将具有动态存储持续时间。它可以包含指向具有不同存储持续时间的对象的指针,但数据成员的生存期与对象的生存期直接相关
在
OnHeap
构造函数中,StackA
具有自动存储持续时间及其所有成员数据,因此如果您试图存储指向它的指针或引用,当构造函数退出时,内存将被回收,您将深入到未定义行为的深度。堆->堆栈B。值包含在堆->堆栈B
中。那么如果Heap->StackB
在堆上,那么Heap->StackB.value
怎么可能在堆上呢?(顺便说一下,喜欢“动态存储持续时间”和“自动存储持续时间”的术语“堆”和“堆栈”——C++语言没有任何“堆”或“栈”的概念。Re-“member”:成员函数与任何其他函数一样(带有一点盐),有一个额外的隐藏参数。这些函数中的变量与自由函数中的变量遵循相同的生存时间和分配规则。是的,OnHeap
的所有部分都将作为new
的一部分进行分配,从而“在堆上”。将类的一部分放在堆栈上的唯一方法是让一个局部变量调用new
,作为其构造(或其他成员函数)的一部分,例如std::string
如何为字符串本身分配内存)是的。。想想看——在构造函数返回后损坏的堆分配对象有什么用处?