通过引用传递引用的指针时理解C++堆/堆栈分配

通过引用传递引用的指针时理解C++堆/堆栈分配,c++,pointers,C++,Pointers,我试图理解在这个例子中,对象的创建和销毁会发生什么 包括 班主任{ 公众: 常量int名称; Person=删除; 人名&姓名:namename{ std::cout添加复制构造函数以查看整个画面 虽然Family::Family通过引用获取对象,但它会将它们复制到成员mom和dad中。因此,您观察到的析构函数调用实际上是在这些成员被析构函数时发生的 在程序退出之前,不会释放原始对象 对于使用新创建的人实例的位置,它们按照C++标准在自由存储区中分配。通常,这意味着它们驻留在堆上。 OTOH,F

我试图理解在这个例子中,对象的创建和销毁会发生什么

包括 班主任{ 公众: 常量int名称; Person=删除; 人名&姓名:namename{
std::cout添加复制构造函数以查看整个画面

虽然Family::Family通过引用获取对象,但它会将它们复制到成员mom和dad中。因此,您观察到的析构函数调用实际上是在这些成员被析构函数时发生的

在程序退出之前,不会释放原始对象

对于使用新创建的人实例的位置,它们按照C++标准在自由存储区中分配。通常,这意味着它们驻留在堆上。


OTOH,Family instance及其所有成员都有一个自动存储。对于大多数流行的编译器/平台,这意味着它是在堆栈上分配的。

添加复制构造函数以了解整个情况

虽然Family::Family通过引用获取对象,但它会将它们复制到成员mom和dad中。因此,您观察到的析构函数调用实际上是在这些成员被析构函数时发生的

在程序退出之前,不会释放原始对象

对于使用新创建的人实例的位置,它们按照C++标准在自由存储区中分配。通常,这意味着它们驻留在堆上。


OTOH,Family instance及其所有成员都有一个自动存储。对于大多数流行的编译器/平台,这意味着它是在堆栈上分配的。

在创建和销毁对象时,您也应该输出它的值。在创建和销毁对象时,您也应该输出它的值。我添加了一个复制构造或者使用签名Familyconst Person&m,const Person&d对家庭和个人进行复制。这是正确的吗?@Pavlin复制构造函数复制自己类型的对象。因此,它们应该是Familyconst Family&and Person const Person&。太棒了,谢谢,这真的很清楚!谢谢你的全面回答,我现在知道了,谢谢!@Pavlin y我们最后的评论打开了谁的所有权问题-谁负责人*成员的生命周期,以及当一个家庭对象被复制/销毁时会发生什么?如果你找不到这个问题的答案,请发布另一个问题。请注意,对象生命周期是一个设计问题,只有解决了这个问题,才应该开始编码。@Pavlin如果通过设计保证这两个人都比family实例长寿,后者可以通过引用或指针存储前者。我使用签名Familyconst Person&m,const Person&d向family和Person添加了一个副本构造函数。这是否正确?@Pavlin副本构造函数复制其自身类型的对象。因此,它们应该是Familyconst Family&和Personconst Person&。太棒了,谢谢,这真的把事情弄清楚了!谢谢你给出了非常全面的答案,我现在明白了,谢谢!@Pavlin你的最后一句话打开了who所有权问题——谁对个人*成员的生命负责,当家庭对象被复制/销毁时会发生什么?如果你不能d此问题的答案请发布另一个问题。请注意,对象生命周期是一个设计问题,只有在解决了这个问题后才应开始编码。@Pavlin如果通过设计保证这两个人都比家族实例寿命长,后者可以通过引用或指针存储前者
Person 1 created -- copy constructor                                                                                                    
Person 2 created -- copy constructor                                                                                                    
Family created                                                                                                                          
Family destroyed                                                                                                                        
Person 2 destroyed                                                                                                                      
Person 1 destroyed