【问题标题】:Exiting a C++ app immediately?立即退出 C++ 应用程序?
【发布时间】:2014-07-18 09:09:18
【问题描述】:

我发现自己需要立即退出跨平台 C++ 应用程序,而不运行析构函数,也不会导致崩溃。我该怎么做?

  • exit(0) 运行析构函数;
  • quick_exit(0) 没有在 VC++ 中实现;
  • abort() 导致崩溃;
  • _Exit(0) 似乎没有在 VC++ 中实现(或者至少没有出现在 MSDN 中);
  • _exit(0) 的文档不清楚它是否调用析构函数——显然,它在 Windows 下调用它们。

我相信我可以在非Windows平台下使用quick_exit,但是我缺乏VC++的解决方案。

澄清(因为人们问我为什么要避免使用析构函数)这是一个优化方案。我正在处理一个大型应用程序,该应用程序操纵千兆字节的 RAM,分配在复杂的图形中,具有多个进程、大量线程、线程安全引用计数、看门狗等。内存管理/资源释放机制经过优化以保持应用程序响应在运行时使用和/或监视可能的错误(取决于构建标志),但这些机制在关机期间显然是过度杀伤力,让 CPU 非常忙碌几秒钟,耗尽电池等 - 在我们确定所有文件描述符之后很久/手柄已关闭。这让用户不满意,所以我正在尝试如何改进这一点,最好不必重构所有内容。

调用quick_exit 专为此类场景设计,但不受VC++ 支持。所以我正在寻找该平台的替代方案。

【问题讨论】:

  • “不运行析构函数”:为什么要避免运行析构函数?他们确实经常做一些非常重要的工作(释放资源)。
  • 如果你的 C++ 程序没有做任何清理就立即退出,那就是崩溃了。
  • 您能解释一下为什么您想要这样做的理由吗?可能还有其他解决方案?
  • 这会有帮助吗? stackoverflow.com/a/2668098/1561026 我认为它说出口不会调用破坏者
  • @JBL:你不想运行析构函数的一个例子是,如果应用程序是某种对物理世界有影响的过程调节控制器(想想核反应堆控制;)) .如果此类程序的自我诊断检测到出现严重错误,则您无法再假设清理代码是否不会使事情变得更糟。根据程序正在做什么,有时希望在不执行任何清理的情况下终止进程,以便系统处于其状态以进行进一步诊断或单独的紧急关闭接管

标签: c++ cross-platform exit


【解决方案1】:

使用在 signal.h 中定义的 C signals 它应该在大多数平台上都受支持。

您特别应该使用 SIGABRT 或 kill() 调用 raise()。

【讨论】:

  • SIGABRT 信号将与调用abort 具有相同的效果(它是这样实现的),并且这将被操作系统视为崩溃(可能是核心转储,报告为崩溃由 Apple 为 iOS 应用程序提供,...)。
猜你喜欢
  • 2019-04-28
  • 2014-09-04
  • 1970-01-01
  • 2011-02-01
  • 1970-01-01
  • 2012-11-16
  • 2020-04-02
  • 1970-01-01
相关资源
最近更新 更多