可能重复: 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;,当它的初始化实际发生时static constexpr MyClass myclass; in C++11尤其是,它们是否会在常规程序端上被销毁(也就是说,main没有出错)?标准是怎么写的呢?
我注意到私有析构函数阻止了所有这些变量的创建。但是如果我没记错的话,在某个地方已经明确提到了一些静态数据可能会被放入静态数据部分并加载预构造的。这对我来说意味着不会调用析构函数。这意味着我被允许定义这样一个变量..。
发布于 2012-10-04 13:43:07
当控制流离开main()时,会调用文件或命名空间作用域对象的析构函数。
如果一个异常离开main(),那么它的实现定义了是否调用任何对象的析构函数。使用现代编译器,在本例中不会调用析构函数,以便在抛出未处理异常时方便地检查程序状态。早期的C++实现使用基于setjmp/longjmp的异常机制,这将在搜索异常处理程序时解除堆栈,从而调用析构函数,即使最终没有找到合适的异常处理程序。
如果应用程序以_exit()、_Exit()或std::quick_exit()终止,则不调用析构函数。
发布于 2012-10-04 13:58:29
具有静态生存期的对象的析构函数(您提到的所有情况都定义具有静态生存期的对象--尽管我不认为constexpr中的对象可以有一个非平凡的析构函数)是从exit()内部调用的,其顺序相反。
从main返回将导致使用返回值调用exit,因此从main返回将导致调用这些析构函数。其他程序终止方式(abort()、断言失败、_exit()等)不会调用析构函数。
如果对象位于DLL (Unix下的.so)中,则在卸载DLL时通常会调用析构函数。
https://stackoverflow.com/questions/12728535
复制相似问题