类数据成员的销毁顺序

Destruction order of class data members?

本文关键字:顺序 数据成员      更新时间:2023-10-16

想象一下这样的类:

class foo {
public:
    foo() : _bar{new bar}, _baz{new baz} {}
private:
    unique_ptr<bar> _bar;
    unique_ptr<baz> _baz;
};

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

假设_baz确实取决于_bar的存在,也许它使用了_bar拥有的一些资源(假设它知道_bar对象,即使构造函数没有反映这一点)。因此,在这种情况下,如果_bar首先被销毁(当它要销毁foo时),那么_baz可能会尝试访问_bar的销毁程序释放的一些资源。

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

数据成员的销毁顺序与其声明顺序相反,与范围内声明的变量相同:

{
  // a, b constructed in that order
  bar a;
  baz b;
} // b, a destroyed in that order