当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《exit()和abort()有什么区别?》经验,为你挑选了4个好方法。

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



1> Johannes Sch..:

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

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

将破坏ab正确,但不会称为破坏者c.abort()不会调用两个对象的析构函数.由于这是不幸的,C++标准描述了一种确保正确终止的替代机制:

具有自动存储持续时间的对象在程序中被销毁,该程序的功能不main()包含自动对象并执行调用exit().可以main()通过抛出捕获的异常将控制直接转移到这样的a 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);.


+1因为,虽然Brian R. Bondy很好,但你确实提出了中止/退出的问题(不是被称为堆栈对象的析构函数),并为RAII密集型C++进程提供了替代方案.

2> Brian R. Bon..:

abort发送SIGABRT信号,退出只关闭执行正常清理的应用程序.

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

abort不会对静态成员和全局成员执行对象破坏,但是会退出.

当然,虽然当应用程序完全关闭时,操作系统将释放任何不同的内存和其他资源.

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

请参阅以下示例:

SomeClassType someobject;

void myProgramIsTerminating1(void)
{
  cout<<"exit function 1"<

评论:

如果取消注释中止:不打印任何内容,并且不会调用someobject的析构函数.

如果abort如上所述进行注释:将调用someobject析构函数,您将获得以下输出:

退出功能2
退出功能1



3> Robert Gambl..:

程序调用exit()时会发生以下情况:

atexit执行该功能注册的功能

刷新并关闭所有打开的流,tmpfile删除创建的文件

程序以指定的退出代码终止到主机

abort()函数发送SIGABRT信号到电流过程中,如果它没有被捕获该程序终止于不能保证打开的流被刷新/关闭或通过创建的临时文件tmpfile被移除,atexit注册功能不叫,和非零退出状态将返回给主机.



4> Federico A. ..:

从exit()手册页:

exit()函数导致正常的进程终止,status&0377的值返回给父进程.

从abort()手册页:

abort()首先取消阻塞SIGABRT信号,然后为调用进程引发该信号.除非捕获SIGABRT信号且信号处理程序未返回,否则会导致进程异常终止.

推荐阅读
赛亚兔备_393
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有