在块程序结束时析构函数调用的顺序

Order of the destructor calls at the end of blockprogram

本文关键字:函数调用 顺序 析构 程序 结束      更新时间:2023-10-16

因此,在块\程序结束时,编译器调用自己定义的对象的析构函数。是否有调用析构函数的特定顺序?

class Foo1{
public:
~Foo1 () {cout << "Foo1 DTOR" << endl;}
};
class Foo2{
public:
~Foo2 () {cout << "Foo2 DTOR" << endl;}
};
void main(){
Foo1 A;
Foo2 B;
}

运行这个程序时,我得到了输出:

Foo2 DTOR

Foo1 DTOR

它总是从最后一个定义的对象开始,到第一个对象结束吗?或者这种行为是无法预测的,而我的输出是这种情况下特有的?

析构函数总是以与构造函数相反的顺序运行(动态内存除外,程序员显式删除内存中的对象(调用它的析构函数))。

在您的示例中,A位于B之前,所以它是前面调用的构造函数。这就是为什么它的析构函数是在B的析构因子之后调用的。

对象生存期的后进先出法排序是唯一有意义的。考虑一下这个中等代表性的例子:
struct ValueHolder
{
    int value;
    ValueHolder() : value(0) { }
    ~ValueHolder() { std::cout << "Value = " << value << "n"; }
};
struct HolderGuard
{
    ValueHolder & h;
    HolderGuard(ValueHolder & vh) : vh(h) { }
    ~HolderGuard() { ++h.value; }
};

用法:

int main()
{
    ValueHolder h;
    HolderGuard(h);
}

这将首先增加持有的值,然后打印它。如果后面的东西没有首先销毁,后面的东西就不可能依赖于前面的东西。

(示例构造的美妙之处在于,即使后面的代码抛出异常,它也能做正确的事情。)