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類,那麼其它的全局類在此時將無法正確寫日誌。

把數據寫回文件, 刪除臨時文件, 這纔是真正有用的.

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章