静态对象析构函数与atexit处理函数谁先执行?顺序是否确定?
C++中静态对象析构函数与atexit注册函数的执行顺序
静态对象的析构函数会先于通过atexit注册的处理函数执行,且该执行顺序是C++标准明确保证的,不属于未定义行为。
标准规定的执行逻辑
C标准(C11及后续版本)对程序退出阶段的执行顺序有明确规则:
- 当
main函数返回后,首先按静态对象构造顺序的逆序调用所有静态存储期对象的析构函数。 - 待所有静态对象析构完成后,再按注册顺序的逆序调用所有通过
atexit(或std::atexit)注册的处理函数。
示例验证
示例代码
#include <iostream> #include <cassert> using namespace std; struct TraceHelper { TraceHelper() { cout << "TraceHelper::constructor()" << endl; } ~TraceHelper() { cout << "TraceHelper::destructor()" << endl; } }; void trace_fn() { static TraceHelper th; cout << "trace_fn()" << endl; } void my_atexit() { cout << "my_atexit()" << endl; } int main() { cout << "Entered main()" << endl; assert(0 == atexit(my_atexit)); trace_fn(); trace_fn(); cout << "Exiting main()" << endl; return 0; }
运行输出
Entered main() TraceHelper::constructor() trace_fn() trace_fn() Exiting main() TraceHelper::destructor() my_atexit()
输出解释
示例中静态对象th在第一次调用trace_fn()时完成构造,main函数返回后,程序先执行该静态对象的析构函数(输出TraceHelper::destructor()),再执行通过atexit注册的my_atexit()函数(输出my_atexit()),完全符合标准规定的顺序。
内容的提问来源于stack exchange,提问作者ivan_onys
相关产品推荐
相关产品推荐

