class 数据成员的销毁顺序?

Destruction order of class data members?

想象这样一个 class:

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