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

时间:2012-10-04 13:38:41

标签: c++ destructor lifetime

  

可能重复:
  Does C++ call destructors for global and class static variables?

的生命周期是什么
  • 全球MyClass myclass;
  • 全球static MyClass myclass;
  • 全球const MyClass myclass;
  • 全球static const MyClass myclass;
  • 在初始化实际发生时函数本地static MyClass myclass;
  • C ++ 11中的全局static constexpr MyClass myclass;

尤其是会在正常的程序结束时销毁(即main没有错误)?标准在哪里说明了这一点。

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

2 个答案:

答案 0 :(得分:6)

具有静态生命周期的对象的析构函数(所有情况都是你的 提到用静态生命定义对象 - 虽然我不认为 constexpr中的一个对象可以有一个非平凡的析构函数) 从exit()内调用,与对象相反 构造

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

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

答案 1 :(得分:4)

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

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

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