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>和 StAcc.class。值< /C> >,这是真的吗?

首先,术语“代码>堆栈和 Heope<代码>没有按照您认为的方式定义在C++中。该标准对分配非常不可知,并且讨论的是存储持续时间,而不是分配区域。当您说“在堆栈上分配”时,实际上是指自动存储持续时间,这可能涉及堆栈分配、寄存器分配或不分配(优化输出)。当您说“在堆上分配”时,实际上是指动态存储持续时间,这可能涉及在空闲存储上分配(这类似于堆概念的抽象)

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

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


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

堆->堆栈B。值
包含在
堆->堆栈B
中。那么如果
Heap->StackB
在堆上,那么
Heap->StackB.value
怎么可能在堆上呢?(顺便说一下,喜欢“动态存储持续时间”和“自动存储持续时间”的术语“堆”和“堆栈”——C++语言没有任何“堆”或“栈”的概念。Re-“member”:成员函数与任何其他函数一样(带有一点盐),有一个额外的隐藏参数。这些函数中的变量与自由函数中的变量遵循相同的生存时间和分配规则。是的,
OnHeap
的所有部分都将作为
new
的一部分进行分配,从而“在堆上”。将类的一部分放在堆栈上的唯一方法是让一个局部变量调用
new
,作为其构造(或其他成员函数)的一部分,例如
std::string
如何为字符串本身分配内存)是的。。想想看——在构造函数返回后损坏的堆分配对象有什么用处?