对于一个用C++写的程序,被加载至内存后运行,最终走向死亡。程序的死亡大致有三种:
- 自然死亡,即无疾而终,通常就是main()中的一个return 0;
- 自杀,当程序发现自己再活下去已经没有任何意义时,通常会选择自杀。当然,这种自杀也是一种请求式的自杀,即请求OS将自己毙掉。有两种方式:void exit(int status)和void abort(void)。
- 他杀,同现实不同的是,程序家族中的他杀行径往往是由自己至亲完成的,通常这个至亲就是他的生身父亲(还是母亲?)。C++并没有提供他杀的凶器,这些凶器往往是由OS直接或者间接(通过一些进程库,如pthread)提供的。
自然死是最完美的结局,他杀是我们最不愿意看到的,自杀虽是迫不得已,但主动权毕竟还是由程序自己掌控的;abort被调用时,程序将直接退出,任何对象的析构函数都不会调用
abort writes a termination message on stderr ("Abnormal program
termination"), then aborts the program by a call to _exit with exit code 3.
exit terminates the calling process. Before termination, exit does the
following:
closes all files
writes buffered output (waiting to be output)
calls any registered "exit functions" (posted with atexit)
abort()仅仅使程序退出,啥也不做.
exit()在退出前要做一些清理工作.
在华中科技大学《C++程序设计实践教程》中,谈到这一区别:
按面向对象的思想,程序也是一个对象,因此,程序也有生有死。
C++在编译一个程序后,这样执行程序:(1)执行开工函数,此时对
程序初始化,主要指全局变量初始化。(2)调用main函数。(3)执行
收工函数,对全局变量(对象)进行析构。所以如下程序会有输出,
尽管main函数为空:
#include <stdio.h>
int x=printf("ABCDEF");
void main( ){ }
现在,来谈abort和exit以及return的区别。return返回,可析构
main或函数中的局部变量,尤其要注意局部对象,如不析构可能造成
内存泄露。exit返回不析构main或函数中的局部变量,但执行收工函数,
故可析构全局变量(对象)。abort不析构main或函数中的局部变量,也不
执行收工函数,故全局和局部对象都不析构。
所以,用return更能避免内存泄露,在C++中用abort和exit都不是好
习惯。
请给分。