1

可能重复:
C++ 是否为全局和类静态变量调用析构函数?

寿命是多少

  • 全球的MyClass myclass;
  • 全球的static MyClass myclass;
  • 全球的const MyClass myclass;
  • 全球的static const MyClass myclass;
  • static MyClass myclass;实际发生初始化时的本地函数
  • static constexpr MyClass myclass;C++11 中的全局

尤其是它们会在常规程序结束时被销毁(即main没有错误)?标准在哪里如此说明。

我注意到私有析构函数阻止了所有这些变量的创建。但是,如果我没记错的话,它在某处明确提到,一些静态数据可能已被放入静态数据部分并已预先构建加载。这对我来说意味着不会调用任何析构函数。这意味着我可以定义这样一个变量......

4

2 回答 2

6

具有静态生命周期的对象的析构函数(您提到的所有情况都定义具有静态生命周期的对象-尽管我不认为 a 中的对象constexpr可以具有非平凡的析构函数)从内部调用exit(),对象的顺序相反被建造。

从返回值返回main导致exit调用,所以从主返回将导致这些析构函数被调用。程序终止的其他方式(abort()、断言失败、_exit()等)不会调用析构函数。

如果对象在 DLL 中(.so在 Unix 下),则通常会在卸载 DLL 时调用析构函数。

于 2012-10-04T13:58:29.487 回答
4

文件或命名空间范围对象的析构函数在控制流离开时被调用main()

如果一个异常离开main(),那么它的实现定义了是否调用任何对象的析构函数。使用现代编译器,在这种情况下不会调用析构函数,以便在引发未处理的异常时轻松检查程序状态。早期的 C++ 实现使用基于setjmp/的异常机制,longjmp它会在搜索异常处理程序时展开堆栈,因此即使最终没有找到合适的异常处理程序也会调用析构函数。

如果应用程序终止_exit()_Exit()没有std::quick_exit()调用析构函数。

于 2012-10-04T13:43:07.770 回答