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

时间:2013-06-21 15:17:05

标签: c++ destructor

因此,在块\ program的末尾,编译器会自己调用已定义对象的析构函数。是否存在调用析构函数的特定顺序?

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

从最后定义的对象开始到第一个定义的对象结束它是如何工作的?或者这种行为无法预测,我的输出特别适合这种情况?

2 个答案:

答案 0 :(得分:3)

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

在你的例子中,A是B之前的位置,因此它是之前调用的构造函数。这就是为什么它的析构函数是在B的析构函数之后被调用的。

答案 1 :(得分:1)

对象生命周期的LIFO排序是唯一有意义的事情。考虑这个具有中等代表性的例子:

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);
}

这将首先增加保持的值,然后打印它。如果以后的事情没有先被摧毁,以后的事情就不可能依赖于早期的事情。

(示例构造的优点在于,即使以后的代码抛出异常,它也会做正确的事。)