(全局)静态变量将在程序结束时销毁
Will (global) static variables be destroyed at program end?
可能的重复项:
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()
终止,则不会调用析构函数。
相关文章:
- 试图对缓存进行跨步测试,但程序并没有结束
- 为什么我的两个 cin 语句没有在程序结束时运行?
- C ++尝试并捕获未结束的程序
- 为什么我的程序在输入某个形状的面积的测量值后没有结束?
- 全局向量导致 C++ 程序结束时出现段错误
- 程序显示以退出代码 0; 结束
- C++程序从主程序开始执行并在主程序结束?
- 如何立即停止/结束程序?
- 在不释放所有动态分配的资源的情况下结束程序是否有风险
- 线程池如何结束程序
- 客户端发送消息,但服务器在客户端结束程序之前不接收消息
- 如果用户想要输入 x 数量的数字,我如何设法跟踪它然后结束程序?
- 如何从另一个函数中调用的函数结束程序 (C++)
- 如果用户输入 -1 作为动态数组中的数字,如何结束程序
- 引发异常并直接结束程序的自定义异常处理
- MPI在某个进程找到解决方案时使用广播结束程序
- 退出(0)未结束程序
- 通过函数结束程序
- 错误后如何结束C++程序
- 如何在不结束c++程序的情况下结束ncurses ?