为什么数据成员的破坏顺序很重要?

时间:2011-01-15 02:42:41

标签: c++

我在一些书中看到,类中​​数据成员的销毁顺序应与其构造顺序的顺序相反。这条规则的原因是什么?任何例子都表示赞赏。

3 个答案:

答案 0 :(得分:12)

这在很大程度上是为了保持一致性。当按顺序创建多个对象时,它们总是以相反的顺序销毁。例如,请考虑以下带有自动变量的示例:

{ 
    A a;
    B b(a);
}   // b.~B() is called, then
    // a.~A() is called

此处b使用a。通过保证对象按其构造的相反顺序销毁,C ++使对象生存期管理更多更容易。

在类中,您可以在初始化另一个数据成员时将引用传递给一个数据成员。确保以相反的顺序销毁对象,您将获得与自动变量相同的行为:

struct S
{
    A a;
    B b;

    S() : a(), b(a) { }
};

请注意,让数据成员互相引用通常不是一个好主意,但它既可能也有可能有用。

答案 1 :(得分:5)

我想也许你误会了。这不是成员应该按此顺序销毁,而是指定

在极少数情况下,了解项目被销毁的顺序非常重要。

无论如何,这就是对象被摧毁的顺序,你无能为力,但知道这就是正在发生的事情。

答案 2 :(得分:2)

C ++中的生命周期尽可能地嵌套。虽然通常很少,但数据成员可以直接相互依赖(例如,将指针传递给另一个)或间接地(例如,两者都依赖于全局,例如将输出写入stderr),但即使它们不在t,拥有一个指定的顺序是很好的,并且嵌套更适合于其他语言的工作方式(例如,在函数范围内的生命周期),而不是其他顺序。

当然,遵循标准中的“as-if”规则,如果编译器/实现可以确定用户代码无法观察破坏重新排序,那么它可以按照自己喜欢的方式进行。