为什么使用exit()被认为是坏的?

Lig*_*hat 7 c++ standards

我正在读这个问题并且有一个答案解释了为什么使用exit()是坏的,因为:

  • 您将最终从该程序中获得多个退出点
  • 它使代码更复杂(比如使用goto)
  • 它无法释放在运行时分配的内存

我应该澄清我正在使用Qt,所以代码已经有点"复杂",因为我正在利用信号和插槽.话虽这么说,对于问题#1,我看到它与#2有关,但我的代码目前试图避免使用,exit()因为我被告知它会使我的代码看起来像一团糟,但避免exit使它变得一团糟.我有一些功能,不需要返回任何东西,返回东西.例如,当我有用户注册并且他们的用户名已经存在时,而不是仅仅exit()在告知用户注册失败后调用(这是在这种情况下所需的行为)我返回false到一个函数然后返回false到另一个函数然后返回false到然后我的main检查该函数是返回true还是false,如果返回false则返回0.这样可以避免exit()代码干净.

对于第三个问题,不使用exit(0)告诉操作系统该程序是否已完成运行并且操作系统将自行释放该内存?我运行了一个测试用例,exit(0)当我按下一个按钮时,该过程从进程列表中删除并释放内存,那为什么这也是一个问题呢?这似乎是一个彻头彻尾的错误陈述,至少在Windows上.

Ded*_*tor 12

只是盲目地调用exit()程序中的某个地方被认为是不好的,原因很简单:

它没有正确关闭其他线程(它们刚刚被终止),它没有正确刷新所有缓冲区(stdio文件被刷新)并保证永久/共享资源的一致和有效状态(文件/共享内存/其他通信方式) .

尽管如此,如果你能保证没有正在运行的线程可能会干扰(通过被锁定等等),并且所有需要它的缓冲区都会被刷新exit(),这是实现更快关闭的有效方法.

许多现代软件都经过编程,可以更快地关闭:

它是容易崩溃的,因为几乎每次都只使用例如_Exit()(甚至没有调用atexitat_quick_exit注册的挂钩)来关闭它是可以的.在大多数情况下,这比有序关闭快得多(如果可能,应首先销毁Windows用户界面资源,因为它们是例外).

进一步阅读:仅限崩溃的软件(PDF!)

仅崩溃程序安全崩溃并快速恢复.通过启动恢复,只有一种方法可以阻止这种软件 - 通过崩溃 - 只有一种方法来实现它.仅限崩溃的系统是由仅崩溃的组件构建的,并且使用透明的组件级重试可以隐藏最终用户的系统内组件崩溃.在本文中,我们提倡仅针对Internet系统的崩溃设计,表明它可以带来更可靠,可预测的代码以及更快,更有效的恢复.我们提出了如何构建此类仅限崩溃的Internet服务的想法,将成功的技术应用于其逻辑极端.