LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
12
返回列表 发新帖
楼主: 罗小迪

请问exit(1);和return 1; 有什么区别?

[复制链接]
发表于 2008-3-22 10:59:21 | 显示全部楼层
先看一个C语言的程序范例:

  1. // tested under FreeBSD6.2 and Linux-2.6.19

  2. #include <stdio.h>
  3. #include <stdlib.h>

  4. int *m;
  5. int *n;

  6. void bye()
  7. {
  8.     int a;
  9.     n = &a;

  10.     if(m >= n)
  11.         printf ("m>=n\n");
  12.     else
  13.         printf ("n>m\n");
  14. }

  15. int main()
  16. {
  17.     int padding[1048]; //使main的栈帧足够大
  18.     m = padding;
  19.     atexit(bye);

  20.     //return 0;
  21.     exit (0);
  22. }
复制代码

注意 main() 中的 return  和 exit 语句,注释掉 exit 语句时,程序输出“n>m”; 而注释掉 return 语句时,则输出“m>=n”。
所以说,main中的return和exit既有相同之处(均转向执行 _exit(), 继续执行在atexit 中注册的函数 ),但又有
不同之处(return会清理栈桢,即退栈;而exit调用不会清理main栈,而直接在main下方继续压栈,如把bye()压入;
故在这两种不同情形下,bye()函数压栈后,发生了局部变量位置的变化。)

从C++语言来看,也可以看出不同:

  1. // tested under FreeBSD6.2 and Linux-2.6.19

  2. #include <iostream>
  3. using namespace std;

  4. class A{
  5. public:
  6.         A(){ cout<<"Creating..."<<endl; }
  7.         ~A(){ cout<<"Destructing..."<<endl; }
  8. };

  9. int main()
  10. {
  11.         A a;
  12.         //return 0;
  13.         exit(0);
  14. }

复制代码

用 exit 时没有调用 class A 的析构函数, 而用 return 时,析构正常进行。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表