如何优雅地退出一个混合了C/C++的程序

7
我正在将一个C程序(main()是用C编写的)与C++进行接口对接。在我的代码中,我希望在某些时候停止程序的执行。现在我想知道,如何能够干净地做到这一点?
目前,我调用std::terminate(),但更多的是因为缺乏更好的想法。最让我困扰的不是我没有释放内存(因为它在程序终止时会自动释放,对吧?),而是MSVS的Just-in-time调试器弹出了一个丑陋的错误消息,告诉我以一种不寻常的方式终止运行时。
编辑:由于这引起了混淆:在这种情况下,使用return 0main()返回是不可能的。

6
exit(0)有什么问题吗? - ta.speot.is
2
据我所知,std::terminate用于指示异常终止(例如当未捕获的异常到达顶层时)。这可能会触发调试器。 - wintermute
1
正确的做法是以标准化的方式处理控制流和退出(释放句柄、对象、合并线程等),exit(0)是一个不好的选择。 - Bruce
1
只是从 main() 中跳出并返回 EXIT_SUCCESSEXIT_FAILURE,就像已知的宇宙中的其他程序一样,有什么问题吗? - WhozCraig
4
@fewu 如果从主要选项返回不是一个选项,你不觉得这应该在问题中提到吗?给人们他们需要回答你的问题所需的信息。 - jalf
显示剩余4条评论
2个回答

6
如果你关心清理和调用析构函数,那么:
exit(EXIT_SUCCESS); // or EXIT_FAILURE

exitterminateabort 之间,exit 是最好的选择。

  • 函数 exit 调用析构函数并清理自动存储对象(在全局范围声明的对象)。它还调用传递给 atexit 的函数。

  • 函数 abort 适用于异常退出,并且不会清理任何内容。它不会调用传递给 atexit 的函数。

  • C 语言中不存在函数 terminate。当你有一个异常无法处理但需要结束程序时,它非常有用。


2
退出不会调用所有析构函数。 - user1233963
2
@user1233963:该对象在全局范围内声明。http://ideone.com/Mtm7LQ -- 我现在已经在答案中提到了它。 - masoud

3

main函数是程序的起点,main函数通常也应该是程序的结束点。如果你使用return 0;,它表示成功退出。

int main(void) {
    //init
    //do stuff
    //deinit
    return 0; // bye bye
}

您也可以使用exit(0);,但是如果您的退出点分散在各个地方,这会使调试变得更加困难。


不幸的是,我无法使main()返回0。不过使用exit(0)可以解决问题。一直认为这是一种C风格结束程序的方式。 - fewu
@fewu 确保您的 main 函数的返回类型是 int - user694733

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接