C++中Exit()与atexit()函数的使用
来源:http://blog.sina.com.cn/s/blog_5cec5bad0100b0x2.html
一、exit()函数
函数声明:void exit(int state);
exit()函数用于在程序运行的过程中随时结束程序,exit的参数state是返回给操作系统,返回0表示程序正常结束,非0表示程序非正常结束。main函数结束时也会隐式地调用exit函数。exit函数运行时首先会执行由atexit()函数登记的函数,然后会做一些自身的清理工作,同时刷新所有输出流、关闭所有打开的流并且关闭通过标准I/O函数tmpfile()创建的临时文件。
-----------------------------------------------------------------------------------------------------
二、atexit()函数
函数声明:int atexit(void (*func)(void));
很多时候我们需要在程序退出的时候做一些诸如释放资源的操作,但程序退出的方式有很多种,比如main()函数运行结束、在程序的某个地方用exit()结束程序、用户通过Ctrl+C或Ctrl+break操作来终止程序等等,因此需要有一种与程序退出方式无关的方法来进行程序退出时的必要处理。方法就是用atexit()函数来注册程序正常终止时要被调用的函数。
atexit()函数的参数是一个函数指针,函数指针指向一个没有参数也没有返回值的函数。atexit()的函数原型是:int atexit (void (*)(void));
在一个程序中最多可以用atexit()注册32个处理函数,这些处理函数的调用顺序与其注册的顺序相反,也即最先注册的最后调用,最后注册的最先调用。
下面是一段代码示例:
#include <stdlib.h> // 使用atexit()函数所必须包含的头文件stdlib.h
#include <iostream.h>
void terminateTest()
{
cout<<"程序正在结束..."<<endl;
}
int main(void)
{
// 注册退出处理函数
atexit(terminateTest);
cout<<"the end of main()"<<endl;
return 0;
}
程序的运行结果为:
the end of main()
程序正在结束...
这些函数都是在main结束以后才被调用的。atexit只是注册他们,使得他们在main结束以后被调用,看名字就可以看出来。
atexit这个玩意超有用,可以按照你予设的顺序摧毁全局变量(类),例如有个log类,你在其它的全局类里也有可能调用到Log类写日志。所以log类必须最后被析构。假如没有规定析构顺序,那么程序在退出时将有可能首先析构log类,那么其它的全局类在此时将无法正确写日志。
把数据写回文件, 删除临时文件, 这才是真正有用的.
C++中Exit()与atexit()函数的使用相关推荐
- C语言通用工具库之exit()和atexit()函数
一.exit()和atexit()函数 exit()退出程序.在main()函数返回系统时将自动调用exit()函数. atexit()函数通过退出时注册被调用的函数提供这种功能,atexit()接受 ...
- 浅析exit()和atexit()函数
当内核使用一个一个exec函数执行c程序时,在调用main函数之前先调用一个特殊的启动例程,可执行程序需将此例程指定为程序的起始地址.启动例程从内核获取命令行参数和环境变量,然后为调用mian函数做好 ...
- c语言中exit函数_C ++中的exit()函数
c语言中exit函数 介绍 (Introduction) Today we'll learn about exit() in C++. We know we can break out of loop ...
- 出错处理函数abort、exit、atexit、strerror
出错处理函数abort.exit.atexit.strerror. . .2010-06-30 22:43摘要:本文详细讲述了几个出错处理的函数abort.exit.atexit.strerror函数 ...
- exit()与_exit()函数的区别(Linux系统中)
注:exit()就是退出,传入的参数是程序退出时的状态码,0表示正常退出,其他表示非正常退出,一般都用-1或者1,标准C里有EXIT_SUCCESS和EXIT_FAILURE两个宏,用exit(EXI ...
- C/C++ 中 exit() 函数
[知乎上的问题]C/C++ 中 exit() 函数的参数到底有什么意义? C 语言的设计之初就是为 Unix 系统设计的,而这个系统是『很多程序互相配合』搭配成一个系统. 每个运行着的程序都是进程,而 ...
- C/C++中的exit()函数
C/C++中的exit()函数参数 exit()函数本身表示退出程序. 其中: exit(0):表示正常退出 exit(1):表示出错(或非正常)退出.当然,exit()的参数可以不只是1,也可以是其 ...
- atexit函数的执行顺序_多玩YY语音的面试题:C++中如何在main()函数之前执行操作?...
多玩YY语音的面试题:C++中如何在main()函数之前执行操作? 第一反应main()函数是所有函数执行的开始.但是问题是main()函数执行之前如何执行呢? 联想到MFC里面的 C**App类的t ...
- exit()与_exit()函数的区别
注:exit()就是退出,传入的参数是程序退出时的状态码,0表示正常退出,其他表示非正常退出,一般都用-1或者1,标准C里有EXIT_SUCCESS和EXIT_FAILURE两个宏,用exit(EXI ...
最新文章
- libevent源码学习-----Reactor模型
- zabbix 数据采集方法
- 使用STL中的list容器实现单链表的操作
- 每日算法系列【LeetCode 556】下一个更大元素 III
- 第三季-第4课-Linux应用程序地址布局
- 用python写一个地铁线路图_python制作一线城市地铁运行动态图
- 转载 戴仁光:给专职站长的网络创业建议
- FeedDemon 2.6.0.20 Final
- uni-app App和H5平台上传视频截取视频第一帧生成图片
- 计算机管理磁盘管理无法删除卷,磁盘管理器里删除卷是灰色的怎么处理
- Java人脸识别相册分类按时间分类相册按城市分类相册app源码
- MSI微星主板MSI Dual CoreCenter监控软件 2.0.1.5
- NOI 4.6 贪心 2407:书架
- 【B站】Java自学精选视频,Java全套资源奉上,收藏起来慢慢学
- [Jzoj] 3426. 封印一击
- Java 之 Serializable 序列化和反序列化的概念,作用的通俗的解释
- MySQL-基本概念与查询操作(DESC/SELECT/FROM/WHERE/LIKE)
- 【产品笔记】1.什么是精益产品探索
- python提取邮件附件_详解python实现读取邮件数据并下载附件的实例
- NAT-DDNS内网穿透技术,解决动态域名解析难题