在C/C++的函数中,函数的结束时经常看到return与exit()两种语法。究竟他们有什么区别什么联系?下面来谈谈我对他们的认识。
在C语言中:
return后面跟一个数值作为函数的返回值,当程序执行到这一点的时候直接返回,退出到程序调用点,而非退出主程序(return 若是在主程序main函数中,则也会调用atexit函数栈)。
exit( int )函数呢?它在以int数值退出整个主程序之前会做一些清理工作,管理部分资源的生命周期,默认的包括关闭各种输入输出流、句柄、释放动态链接库等。而且用户可以使用int atexit ( void ( * function ) (void) )函数来设置exit函数执行时需要做的一些清理工作。所设置的多个结束时要调用的清理函数以atexit设置的逆顺序来执行,相当于设置了一个程序清理函数栈。
- #include <stdio.h>
- #include <stdlib.h>
- void fnExit1 (void)
- {
- puts ("Exit function 1.");
- }
- void fnExit2 (void)
- {
- puts ("Exit function 2.");
- }
- int main ()
- {
- atexit (fnExit1);
- atexit (fnExit2);
- puts ("Main function.");
- exit (0);
- }
输出结果:
- Main function.
- Exit function 2.
- Exit function 1.
在C++语言中,在C++中执行return语句之前,默认是结束C++函数中局部变量的生命周期,调用各自的析构函数。
- 1 #include <iostream>
- 2
- 3 class A
- 4 {
- 5 public:
- 6 A ()
- 7 {
- 8 std::cout << "Constructing ..." << std::endl;
- 9 }
- 10 ~A ()
- 11 {
- 12 std::cout << "Deconstructing ..."<< std::endl;
- 13 }
- 14 };
- 15
- 16 int
- 17 main (void)
- 18 {
- 19 A a;
- 20 return 0;
- 21 }
输出结果:
- Constructing ...
- Deconstructing ...
然而exit()函数属于纯ISO C的函数库,不适用来退出C++函数题,因为面向对象的C++语句会自动调用各自变量的析构函数来管理资源。当然了,如果你混用纯C和面向对象C++两种风格的话,就要自己负责对纯C部分的资源管理。
1 #include <iostream>
- 2
- 3 class A
- 4 {
- 5 public:
- 6 A ()
- 7 {
- 8 std::cout << "Constructing ..." << std::endl;
- 9 }
- 10 ~A ()
- 11 {
- 12 std::cout << "Deconstructing ..."<< std::endl;
- 13 }
- 14 };
- 15
- 16 int
- 17 main (void)
- 18 {
- 19 A a;
- 20 exit (0);
- 21 }
输出结果:
总结:C中,return 返回到调用点,exit越过调用点直接退出主程序;C++中使用return会调用对象析构函数,exit不析构(易产生内存等资源泄漏)。
这里有一篇更详细的文章讨论C++中return exit abort。
阅读(1786) | 评论(0) | 转发(0) |