C++ 为什么认为使用exit()不好?

C++ 为什么认为使用exit()不好?,c++,standards,C++,Standards,我正在阅读,有一个答案解释了为什么使用exit()不好,因为: 您最终将从程序中获得多个退出点 它使代码更加复杂(如使用goto) 它无法释放运行时分配的内存 我应该澄清一下,我使用的是Qt,因此代码已经有点“复杂”,因为我利用了信号和插槽。话虽如此,对于问题1,我认为它与问题2有关,但我的代码目前试图避免使用exit(),因为有人告诉我,这会使我的代码看起来像一团乱麻,但避免exit会把它弄得一团糟。我有一些函数,不需要返回任何东西,返回东西。例如,当我让用户注册并且他们的用户名已经存在时

我正在阅读,有一个答案解释了为什么使用
exit()
不好,因为:

  • 您最终将从程序中获得多个退出点
  • 它使代码更加复杂(如使用goto)
  • 它无法释放运行时分配的内存
我应该澄清一下,我使用的是Qt,因此代码已经有点“复杂”,因为我利用了信号和插槽。话虽如此,对于问题1,我认为它与问题2有关,但我的代码目前试图避免使用
exit()
,因为有人告诉我,这会使我的代码看起来像一团乱麻,但避免
exit
会把它弄得一团糟。我有一些函数,不需要返回任何东西,返回东西。例如,当我让用户注册并且他们的用户名已经存在时,而不是在告诉用户注册失败后调用
exit()我将
false
返回到一个函数,然后该函数将
false
返回到另一个函数,然后该函数将
false
返回到我的main,main将检查该函数是否返回true或false,如果返回false,则返回0。要避免
exit()
使代码变得干净,就到此为止


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

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

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

不过,如果您可以保证没有线程正在运行,这可能会造成干扰(通过持有锁或类似的方式被杀死),并且所有需要它的缓冲区都将被
exit()
刷新,那么这是实现更快关机的有效方法

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

它具有容错性,几乎每次都可以使用
\u Exit()
(甚至不调用
atexit
在\u quick\u Exit
注册挂钩)关闭。在大多数情况下,这比有序关闭要快得多(如果可能的话,应该首先销毁Windows用户界面资源,因为它们是一个例外)

进一步阅读:

仅崩溃程序安全崩溃并快速恢复。 只有一种方法可以阻止这种软件——崩溃 它——也是唯一一种解决问题的方法——启动复苏。 仅限碰撞系统由仅限碰撞的组件构建, 以及使用透明组件级重试 对最终用户隐藏系统内组件崩溃。在里面 在本文中,我们主张对互联网系统进行仅限崩溃的设计, 表明它可以带来更可靠、更可预测的结果 代码和更快、更有效的恢复。我们提出想法 关于如何构建这样的仅限崩溃的互联网服务,请 成功的技术达到了逻辑的极限


第1项和第2项,我不同意。这些更多的是风格和偏好的问题

至于第3项,您应该查看文档,以了解它实际将释放或刷新(和)哪些内容。例如,MS文档说“在终止进程之前刷新所有文件缓冲区。”


当您的程序退出时,操作系统将回收内存,但这不是他所说的。他的意思是,像信号量这样的资源不会被正确或及时地释放。也许这是一个问题,也许不是,这取决于你在使用什么样的资源

操作系统无法清理所有内容。设想一个析构函数终止一个在线连接,或者将文本刷新到日志文件。操作系统对于析构函数中可能发生的事情是非常有限的。因此,不会发生堆栈展开。即使是全局对象也不会被破坏。但是用atexit()注册的函数将被调用。@Josh但这似乎不正确,因为我刚刚测试了它,内存已被清除。这完全是错误的-几乎每个操作系统都会尽可能“清理”您的资源-绑定到进程的套接字将被销毁,文件将被关闭等等。但它无法清除进程中潜在的无效数据-如果它在写入所有数据之前结束。。。好。。。很明显会发生什么。是的,在那之后,它的定义相当明确,大多数古代人(创造第一个操作系统的人)每天都会创建这样的程序。它被称为“程序编程”。可读性不强,有点容易出错,总体上很难看,不可取,但它可以工作。哪些用户界面资源必须明确销毁?进程终止后,Windows不收回所有这些对象吗?@Ruslan是的,Windows将收回它们。但这比自己明确地清理它们要慢。