【发布时间】: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