类数据成员的破坏顺序?

ada*_*603 3 c++ destructor operator-precedence

想象一下这样的一个类:

class foo {
public:
    foo() : _bar{new bar}, _baz{new baz} {}
private:
    unique_ptr<bar> _bar;
    unique_ptr<baz> _baz;
};
Run Code Online (Sandbox Code Playgroud)

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

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

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

jua*_*nza 8

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

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

} // b, a destroyed in that order
Run Code Online (Sandbox Code Playgroud)

  • 只是包含这个在12.4(8)中定义:...基础和成员按照构造函数完成的相反顺序销毁... (4认同)