(全局)静态变量将在程序结束时销毁

Will (global) static variables be destroyed at program end?

本文关键字:结束 程序 全局 静态 变量      更新时间:2023-10-16

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

什么是寿命

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

特别是它们会在常规程序结束时被销毁(即 main没有错误)?标准在哪里这样规定。

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

具有

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

main返回会导致使用返回值调用exit,因此,从 Main 返回将导致调用这些析构函数。 其他程序终止的方法(abort()、断言失败、_exit()、等)不会调用析构函数。

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

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

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

如果应用程序以 _exit()_Exit()std::quick_exit()终止,则不会调用析构函数。