首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >(全局)静态变量会在程序结束时被销毁吗?

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

Stack Overflow用户
提问于 2012-10-04 13:38:41
回答 2查看 8.1K关注 0票数 1

可能重复: 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没有出错)?标准是怎么写的呢?

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-10-04 13:43:07

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

如果一个异常离开main(),那么它的实现定义了是否调用任何对象的析构函数。使用现代编译器,在本例中不会调用析构函数,以便在抛出未处理异常时方便地检查程序状态。早期的C++实现使用基于setjmp/longjmp的异常机制,这将在搜索异常处理程序时解除堆栈,从而调用析构函数,即使最终没有找到合适的异常处理程序。

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

票数 4
EN

Stack Overflow用户

发布于 2012-10-04 13:58:29

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

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

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

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12728535

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档