类数据成员的破坏顺序?

Posted

技术标签:

【中文标题】类数据成员的破坏顺序?【英文标题】:Destruction order of class data members? 【发布时间】:2015-03-20 13:53:04 【问题描述】:

想象一个这样的类:

class foo 
public:
    foo() : _barnew bar, _baznew baz 
private:
    unique_ptr<bar> _bar;
    unique_ptr<baz> _baz;
;

所以每当foo 的实例被破坏时,如果这是定义的行为,那么它的数据成员将以什么顺序被破坏?

假设_baz 确实依赖于_bar 的存在,也许它使用了_bar 拥有的一些资源(假设它知道_bar 对象,即使构造函数没有反映这一点)。 所以在这种情况下,如果_bar 首先被破坏(当它需要破坏foo 时),那么_baz 可能会尝试访问一些已被_bar 的析构函数释放的资源。

一个明显的解决方案是在foo 中实现析构函数,它以正确的顺序手动释放_baz_bar,但是如果没有实现析构函数怎么办?是否有定义数据成员销毁顺序的默认行为?

【问题讨论】:

【参考方案1】:

数据成员的销毁顺序与其声明顺序相反,与在作用域内声明变量的方式相同:


  // a, b constructed in that order
  bar a;
  baz b;

 // b, a destroyed in that order

【讨论】:

只是为了包括这一点,在 12.4 (8) 中定义: ...基础和成员按照其构造函数完成的相反顺序被销毁...

以上是关于类数据成员的破坏顺序?的主要内容,如果未能解决你的问题,请参考以下文章

DynamicList

类成员的编译顺序之嵌套类型对类的影响

一文详解:Java中父子类静态块构造块构造方法成员变量之间的初始化先后顺序与执行先后顺序

为啥类的大小取决于成员声明的顺序?如何?

c++数据对齐/成员顺序&继承

JVM17_Tomcat打破双亲委派机制执行顺序底层代码原理Tomcat|JDBC破坏双亲委派机制带来的面试题