类数据成员的破坏顺序?
Posted
技术标签:
【中文标题】类数据成员的破坏顺序?【英文标题】:Destruction order of class data members? 【发布时间】:2015-03-20 13:53:04 【问题描述】:想象一个这样的类:
class foo
public:
foo() : _barnew bar, _baznew baz
private:
unique_ptr<bar> _bar;
unique_ptr<baz> _baz;
;
所以每当foo
的实例被破坏时,如果这是定义的行为,那么它的数据成员将以什么顺序被破坏?
假设_baz
确实依赖于_bar
的存在,也许它使用了_bar
拥有的一些资源(假设它知道_bar
对象,即使构造函数没有反映这一点)。
所以在这种情况下,如果_bar
首先被破坏(当它需要破坏foo
时),那么_baz
可能会尝试访问一些已被_bar
的析构函数释放的资源。
一个明显的解决方案是在foo
中实现析构函数,它以正确的顺序手动释放_baz
和_bar
,但是如果没有实现析构函数怎么办?是否有定义数据成员销毁顺序的默认行为?
【问题讨论】:
【参考方案1】:数据成员的销毁顺序与其声明顺序相反,与在作用域内声明变量的方式相同:
// a, b constructed in that order
bar a;
baz b;
// b, a destroyed in that order
【讨论】:
只是为了包括这一点,在 12.4 (8) 中定义: ...基础和成员按照其构造函数完成的相反顺序被销毁...以上是关于类数据成员的破坏顺序?的主要内容,如果未能解决你的问题,请参考以下文章