在块程序结束时析构函数调用的顺序
Order of the destructor calls at the end of blockprogram
因此,在块\程序结束时,编译器调用自己定义的对象的析构函数。是否有调用析构函数的特定顺序?
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);
}
这将首先增加持有的值,然后打印它。如果后面的东西没有首先销毁,后面的东西就不可能依赖于前面的东西。
(示例构造的美妙之处在于,即使后面的代码抛出异常,它也能做正确的事情。)
相关文章:
- 函数调用中参数的顺序重要吗
- C++:使用方法调用析构函数的顺序是什么?
- 以 f() + g() 调用顺序的 C++ 函数
- 函数中调用的构造函数的顺序
- x64 函数调用参数推送/移动顺序 (MSVC)
- COUT 内部函数调用的顺序
- 析构函数的奇怪调用顺序
- 构造函数的初始值设定项列表中的函数调用是否按顺序排序?
- C++:cout 和函数调用之间的计算顺序
- 当指定初始化程序的顺序和字段声明不一致时,clang可以删除函数调用
- 输入法管理器函数 - 平假名到汉字候选列表 c++ covnersion 的正确调用顺序
- 函数调用的顺序
- 在C++中为临时库调用析构函数的顺序是什么
- 构造函数的调用顺序
- 构造函数和析构函数调用的顺序
- 析构函数调用的顺序C++
- 此代码是否依赖于函数调用顺序未定义的行为
- 无法理解析构函数调用顺序
- 构造函数调用顺序与组合
- visual studio-C++函数调用顺序(boost)-混乱