想象一下这样的课程:
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
,但是如果没有实现析构函数呢?是否存在定义数据成员的销毁顺序的默认行为?
答案 0 :(得分:8)
数据成员的销毁顺序与其声明顺序相反,与范围内声明的变量相同:
{
// a, b constructed in that order
bar a;
baz b;
} // b, a destroyed in that order