1

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

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

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

4

2 回答 2

3

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

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

于 2013-06-21T15:18:32.487 回答
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);
}

这将首先增加保存的值,然后打印它。如果后面的东西不先被破坏,后面的东西就不可能依赖前面的东西。

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

于 2013-06-21T15:47:31.857 回答