|
发表于 2008-3-22 10:59:21
|
显示全部楼层
先看一个C语言的程序范例:
- // tested under FreeBSD6.2 and Linux-2.6.19
- #include <stdio.h>
- #include <stdlib.h>
- int *m;
- int *n;
- void bye()
- {
- int a;
- n = &a;
- if(m >= n)
- printf ("m>=n\n");
- else
- printf ("n>m\n");
- }
- int main()
- {
- int padding[1048]; //使main的栈帧足够大
- m = padding;
- atexit(bye);
-
- //return 0;
- exit (0);
- }
复制代码
注意 main() 中的 return 和 exit 语句,注释掉 exit 语句时,程序输出“n>m”; 而注释掉 return 语句时,则输出“m>=n”。
所以说,main中的return和exit既有相同之处(均转向执行 _exit(), 继续执行在atexit 中注册的函数 ),但又有
不同之处(return会清理栈桢,即退栈;而exit调用不会清理main栈,而直接在main下方继续压栈,如把bye()压入;
故在这两种不同情形下,bye()函数压栈后,发生了局部变量位置的变化。)
从C++语言来看,也可以看出不同:
- // tested under FreeBSD6.2 and Linux-2.6.19
- #include <iostream>
- using namespace std;
- class A{
- public:
- A(){ cout<<"Creating..."<<endl; }
- ~A(){ cout<<"Destructing..."<<endl; }
- };
- int main()
- {
- A a;
- //return 0;
- exit(0);
- }
复制代码
用 exit 时没有调用 class A 的析构函数, 而用 return 时,析构正常进行。 |
|