exit()和abort()有什么区别?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (104)

在C和C ++中,exit()和之间有什么区别abort()?我试图在发生错误(不是例外)后结束我的程序。

提问于
用户回答回答于

放弃发送SIGABRT信号,退出只是关闭执行正常清理的应用程序。

您可以根据需要处理中止信号,但默认行为是关闭应用程序以及出现错误代码。

中止不会执行对静态和全局成员的对象销毁,但退出将会执行。

当然,当应用程序完全关闭时,操作系统将释放任何未公布的内存和其他资源。

中止退出程序终止时(假设您没有重写默认行为),返回代码将返回到启动应用程序的父进程。

看下面的例子:

SomeClassType someobject;

void myProgramIsTerminating1(void)
{
  cout<<"exit function 1"<<endl;
}

void myProgramIsTerminating2(void)
{
  cout<<"exit function 2"<<endl;
}

int main(int argc, char**argv)
{
  atexit (myProgramIsTerminating1);
  atexit (myProgramIsTerminating2);
  //abort();
  return 0;
}
 
用户回答回答于

abort()退出程序而不调用atexit()首先注册的函数,并且不先调用对象的析构函数。exit()在退出程序之前都会这样做。它不会为自动对象调用析构函数。所以

A a;
void test() { 
    static A b;
    A c;
    exit(0);
}

将破坏ab正确,但不会调用破坏者cabort()不会调用任何对象的析构函数。由于这是不幸的,C ++标准描述了确保正确终止的替代机制:

具有自动存储持续时间的对象全部在程序中销毁,该程序的功能不main()包含自动对象并执行呼叫exit()。控制可以main()通过抛出一个被捕获的异常直接传递给这样的异常main()

struct exit_exception { 
   int c; 
   exit_exception(int c):c(c) { } 
};

int main() {
    try {
        // put all code in here
    } catch(exit_exception& e) {
        exit(e.c);
    }
}

而不是调用exit(),而是安排该代码throw exit_exception(exit_code);

所属标签

可能回答问题的人

  • 最爱开车啦

    8 粉丝503 提问6 回答
  • 优惠活动秘书

    0 粉丝2 提问6 回答
  • uncle_light

    5 粉丝518 提问5 回答
  • Richel

    6 粉丝0 提问5 回答

扫码关注云+社区

领取腾讯云代金券