C++中的return、exit与abort
来源:互联网 发布:cf23 2网络出现异常 编辑:程序博客网 时间:2024/04/28 22:37
exit():
在调用时,会做大部分清理工作,但是决不会销毁局部对象,因为没有stack unwinding。
会进行的清理工作包括:销毁所有static和global对象,清空所有缓冲区,关闭所有I/O通道。终止前会调用经由atexit()登录的函数,atexit如果抛出异常,则调用terminate()。
abort():
调用时,不进行任何清理工作。直接终止程序。
retrun():
调用时,进行stack unwinding,调用局部对象析构函数,清理局部对象。如果在main中,则之后再交由系统调用exit()。
return返回,可析构
main或函数中的局部变量,尤其要注意局部对象,如不析构可能造成内存泄露。exit返回不析构main或函数中的局部变量,但执行收工函数,
故可析构全局变量(对象)。abort不析构main或函数中的局部变量,也不执行收工函数,故全局和局部对象都不析构。
所以,用return更能避免内存泄露,在C++中用abort和exit都不是好习惯.
抛出异常与栈展开(stack unwinding)
抛出异常时,将暂停当前函数的执行,开始查找匹配的catch子句。首先检查throw本身是否在try块内部,如果是,检查与该try相关的catch子句,看是否可以处理该异常。如果不能处理,就退出当前函数,并且释放当前函数的内存并销毁局部对象,继续到上层的调用函数中查找,直到找到一个可以处理该异常的catch。这个过程称为栈展开(stack unwinding)。当处理该异常的catch结束之后,紧接着该catch之后的点继续执行。
1. 为局部对象调用析构函数
如上所述,在栈展开的过程中,会释放局部对象所占用的内存并运行类类型局部对象的析构函数。但需要注意的是,如果一个块通过new动态分配内存,并且在释放该资源之前发生异常,该块因异常而退出,那么在栈展开期间不会释放该资源,编译器不会删除该指针,这样就会造成内存泄露。
2. 析构函数应该从不抛出异常
在为某个异常进行栈展开的时候,析构函数如果又抛出自己的未经处理的另一个异常,将会导致调用标准库terminate函数。通常terminate函数将调用abort函数,导致程序的非正常退出。所以析构函数应该从不抛出异常。
3. 异常与构造函数
如果在构造函数对象时发生异常,此时该对象可能只是被部分构造,要保证能够适当的撤销这些已构造的成员。
4. 未捕获的异常将会终止程序
不能不处理异常。如果找不到匹配的catch,程序就会调用库函数terminate。
- C++中的return, exit 与 abort
- C++中的return、exit与abort
- C++中的return, exit 与 abort 的区别
- exit abort return 区别
- exit abort return 区别
- atexit、exit、return、abort
- C语言中的exit与return
- abort,exit,return 的区别
- C语言中的return ,exit
- C++中的exit&&abort
- Exit与Abort
- abort exit return 三者区别
- C++ return exit(0) abort()关于回收
- exit(),_exit(),return,abort()函数的区别
- return abort exit函数的区别
- return、exit和abort的区别
- C/C++中的abort、atexit、exit和_Exit
- C/C++中的abort、atexit、exit和_Exit
- ZooKeeper典型应用场景(转)
- 组播地址Multicase address
- Zookeeper-Zookeeper的配置
- Android提权漏洞分析——rageagainstthecage
- Mysql学习笔记备份
- C++中的return、exit与abort
- Tip
- Zookeeper-Zookeeper启动过程
- Hadoop之——搭建ZooKeeper服务器集群
- 黑马程序员——OC语言基础——面向对象三大特性之多态
- Zookeeper-Zookeeper leader选举
- Zookeeper-Zookeeper client
- log4j.properties 详解与配置步骤
- 动态规划初识