因此,在块\ 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
从最后定义的对象开始到第一个定义的对象结束它是如何工作的?或者这种行为无法预测,我的输出特别适合这种情况?
答案 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);
}
这将首先增加保持的值,然后打印它。如果以后的事情没有先被摧毁,以后的事情就不可能依赖于早期的事情。
(示例构造的优点在于,即使以后的代码抛出异常,它也会做正确的事。)