类数据成员的破坏顺序?

时间:2015-03-20 13:53:04

标签: c++ destructor operator-precedence

想象一下这样的课程:

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,但是如果没有实现析构函数呢?是否存在定义数据成员的销毁顺序的默认行为?

1 个答案:

答案 0 :(得分:8)

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

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

} // b, a destroyed in that order