Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/140.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ (全局)静态变量会在程序结束时销毁吗?_C++_Destructor_Lifetime - Fatal编程技术网

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

C++ (全局)静态变量会在程序结束时销毁吗?,c++,destructor,lifetime,C++,Destructor,Lifetime,可能重复: 生命的寿命是什么 全局MyClass MyClass 全局静态MyClass MyClass 全局常量MyClass MyClass 全局静态常量MyClass MyClass 函数本地静态MyClass MyClass实际发生初始化时 全局静态constexpr MyClass MyClass 尤其是它们是否会在常规程序结束时被销毁(即main没有错误)?该标准在哪里规定了这一点 我注意到私有析构函数阻止创建所有这些变量。但如果我没记错的话,有人在某个地方明确提到,一些静态数

可能重复:

生命的寿命是什么

  • 全局<代码>MyClass MyClass
  • 全局<代码>静态MyClass MyClass
  • 全局<代码>常量MyClass MyClass
  • 全局<代码>静态常量MyClass MyClass
  • 函数本地<代码>静态MyClass MyClass实际发生初始化时
  • 全局
    静态constexpr MyClass MyClass
尤其是它们是否会在常规程序结束时被销毁(即
main
没有错误)?该标准在哪里规定了这一点


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

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

如果异常离开
main()
,那么无论是否调用任何对象的析构函数,都是由实现定义的。使用现代编译器,在这种情况下不会调用析构函数,以便在抛出未处理的异常时轻松检查程序状态。早期的C++实现使用了基于<代码> SETJMP >代码> >代码> LojMP的/CUL>的异常机制,在查找异常处理程序时,它将解压缩堆栈,从而调用析构函数,即使最终没有找到合适的异常处理程序。
如果应用程序以
\u exit()
\u exit()
std::quick\u exit()
终止,则不会调用析构函数。

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

如果异常离开
main()
,那么无论是否调用任何对象的析构函数,都是由实现定义的。使用现代编译器,在这种情况下不会调用析构函数,以便在抛出未处理的异常时轻松检查程序状态。早期的C++实现使用了基于<代码> SETJMP >代码> >代码> LojMP的/CUL>的异常机制,在查找异常处理程序时,它将解压缩堆栈,从而调用析构函数,即使最终没有找到合适的异常处理程序。
如果应用程序以
\u exit()
\u exit()
std::quick\u exit()
终止,则不会调用析构函数。

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

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

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

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

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

如果对象在DLL中(
.so
在Unix下),析构函数将
通常在DLL卸载时调用。< /P>可以在析构函数中放置<代码> cOUT/CODEX>语句,请自行查看。@ beta”尝试“由于实现定义和未定义行为,C和C++中经常失败。”让我在我的问题中添加我想知道标准的位置。@德尔南:好点(虽然在这种情况下它是很好定义的)。你可以在析构函数中放一个<代码> cOUT <代码>语句,自己看。@ beta”尝试它“经常由于C++的实现和未定义的行为而在C和C++中失败。”让我补充一个问题,我想知道在标准中查找的位置。@delnan:这一点很好(虽然在本例中定义得很好)。标准说,如果没有捕获异常,将调用
std::terminate()
<代码>标准::终止()
,默认情况下,调用
中止()
。并且
abort()
不允许调用析构函数。当然,还有:调用
exit()
时会调用析构函数。从
main
返回导致调用
exit
。@JamesKanze:好的,谢谢。所提到的函数可能是在一个特定的实现中,然后调用标准函数。@ ToWi> C++>x EXIT()/<代码>和<代码> STD::QuaskExeXTUE()/<代码>是标准C++;前者也是标准的C。
\u exit()
是标准的Unix。@JamesKanze:哦,你说得对。发现它是15.4和18.1。在c++11标准中,标准规定,如果未捕获异常,则调用
std::terminate()
<代码>标准::终止(),默认情况下,调用
中止()
。并且
abort()
不允许调用析构函数。当然,还有:调用
exit()
时会调用析构函数。从
main返回
原因