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
想象这样一个 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