Chinaunix首页 | 论坛 | 博客
  • 博客访问: 146639
  • 博文数量: 8
  • 博客积分: 342
  • 博客等级: 一等列兵
  • 技术积分: 109
  • 用 户 组: 普通用户
  • 注册时间: 2012-03-02 09:31
文章分类

全部博文(8)

文章存档

2012年(8)

分类: C/C++

2012-03-06 10:19:49

   在C/C++的函数中,函数的结束时经常看到return与exit()两种语法。究竟他们有什么区别什么联系?下面来谈谈我对他们的认识。

   在C语言中:
    return后面跟一个数值作为函数的返回值,当程序执行到这一点的时候直接返回,退出到程序调用点,而非退出主程序(return 若是在主程序main函数中,则也会调用atexit函数栈)。
    exit( int )函数呢?它在以int数值退出整个主程序之前会做一些清理工作,管理部分资源的生命周期,默认的包括关闭各种输入输出流、句柄、释放动态链接库等。而且用户可以使用int atexit ( void ( * function ) (void) )函数来设置exit函数执行时需要做的一些清理工作。所设置的多个结束时要调用的清理函数以atexit设置的逆顺序来执行,相当于设置了一个程序清理函数栈。
  1. #include <stdio.h>
  2. #include <stdlib.h>

  3. void fnExit1 (void)
  4. {
  5.   puts ("Exit function 1.");
  6. }

  7. void fnExit2 (void)
  8. {
  9.   puts ("Exit function 2.");
  10. }

  11. int main ()
  12. {
  13.   atexit (fnExit1);
  14.   atexit (fnExit2);
  15.   puts ("Main function.");
  16.   exit (0);
  17. }
   输出结果:
  1. Main function.
  2. Exit function 2.
  3. Exit function 1.

  在C++语言中,在C++中执行return语句之前,默认是结束C++函数中局部变量的生命周期,调用各自的析构函数。
  1. 1 #include <iostream>
  2.   2 
  3.   3 class A
  4.   4 {
  5.   5 public:
  6.   6 A ()
  7.   7 {
  8.   8 std::cout << "Constructing ..." << std::endl;
  9.   9 }
  10.  10 ~()
  11.  11 {
  12.  12 std::cout << "Deconstructing ..."<< std::endl;
  13.  13 }
  14.  14 };
  15.  15 
  16.  16 int
  17.  17 main (void)
  18.  18 {
  19.  19 A a;
  20.  20 return 0;
  21.  21 }
 输出结果:
  1. Constructing ...
  2. Deconstructing ...
   然而exit()函数属于纯ISO C的函数库,不适用来退出C++函数题,因为面向对象的C++语句会自动调用各自变量的析构函数来管理资源。当然了,如果你混用纯C和面向对象C++两种风格的话,就要自己负责对纯C部分的资源管理。

  1. 1 #include <iostream>
  2.   2 
  3.   3 class A
  4.   4 {
  5.   5 public:
  6.   6 A ()
  7.   7 {
  8.   8 std::cout << "Constructing ..." << std::endl;
  9.   9 }
  10.  10 ~()
  11.  11 {
  12.  12 std::cout << "Deconstructing ..."<< std::endl;
  13.  13 }
  14.  14 };
  15.  15 
  16.  16 int
  17.  17 main (void)
  18.  18 {
  19.  19 A a;
  20.  20 exit (0);
  21.  21 }
 输出结果:
  1. Constructing ...
总结:C中,return 返回到调用点,exit越过调用点直接退出主程序;C++中使用return会调用对象析构函数,exit不析构(易产生内存等资源泄漏)。
这里有一篇更详细的文章讨论C++中return exit abort。

阅读(1790) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~