如何退出C++控制台程序?

rec*_*gle 29 c++ exit

是否有一行代码将终止该程序?

像python的东西sys.exit()

Jam*_*lis 26

虽然您可以调用exit()(如果您的应用程序遇到一些致命错误,可能需要这样做),退出程序的最简洁方法是从main()以下位置返回:

int main()
{
    // do whatever your program does

} // function returns and exits program
Run Code Online (Sandbox Code Playgroud)

当您调用时exit(),具有自动存储持续时间(本地变量)的对象在程序终止之前不会被销毁,因此您无法进行适当的清理.这些对象可能需要清理它们拥有的任何资源,保留任何挂起的状态更改,终止所有正在运行的线程,或执行其他操作以使程序干净地终止.

  • 如果你需要从程序中深入退出,`main`中的try/catch块可能比`exit()`更可取.这真的是C的延续. (7认同)

Ben*_*ley 21

#include <cstdlib>
...
exit( exit_code );
Run Code Online (Sandbox Code Playgroud)

  • 使用退出并不好.它打破了我们花时间正确构建的所有RAII对象.把它扔回去是很好的.如果另一方面程序已损坏,你应该真的调用std :: terminate() (5认同)
  • 投票失败,因为它没有关于它如何打破RAII精彩世界的免责声明. (5认同)
  • @ Whisty:是的std :: terminate()基本上是abort()的C++版本(不同之处在于你可以覆盖并因此进行少量清理(我强调**TINY**)).这是最后的召唤(如abort()).但是在数据被破坏的时候,展开堆栈几乎没有意义.损坏的数据意味着没有任何东西可以信任(甚至堆栈展开也没有).std :: terminate()就是你故意不想让堆栈放松(因为你不能信任它)而你需要一个核心转储来进行dubuging时所调用的. (2认同)

Bow*_*ens 7

有几种方法可以使程序终止.哪一个是合适的取决于您希望程序终止的原因.绝大部分时间都应该在main函数中执行return语句.如下所示.

int main()
{
     f();
     return 0;
}
Run Code Online (Sandbox Code Playgroud)

正如其他人已经确定的那样,这样可以正确地破坏所有堆栈变量,从而正确地进行清理.这是非常重要的.

如果您在代码深处某处检测到错误,并且需要退出,则应抛出异常以返回main函数.如下所示.

struct stop_now_t { };
void f()
{
      // ...
      if (some_condition())
           throw stop_now_t();
      // ...
}

int main()
{
     try {
          f();
     } catch (stop_now_t& stop) {
          return 1;
     }
     return 0;
 }
Run Code Online (Sandbox Code Playgroud)

这会导致堆栈展开所有要被破坏的堆栈变量.仍然非常重要.请注意,使用非零返回值指示失败是合适的.

如果在不太可能的情况下,您的程序检测到一个条件,指示执行更多语句不再安全,那么您应该使用std :: abort().这将使您的程序突然停止,无需进一步处理.std :: exit()是类似的,但可能会调用atexit处理程序,如果你的程序被充分borked可能会很糟糕.