在程序中,最多可以向ATEXIT注冊32個處理函數,這些處理函數的調用順序與注冊順序相反,下文是武林技術頻道小編為大家介紹的詳細解析exit和atexit的區別,希望對你學習這方面知識有所幫助!
一、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個處理函數,這些處理函數的調用順序與其注冊的順序相反,也即最先注冊的最后調用,最后注冊的最先調用。
下面是一段代碼示例:
?
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類,那么其它的全局類在此時將無法正確寫日志。
把數據寫回文件, 刪除臨時文件, 這才是真正有用的.
上面就是武林技術頻道小編給大家介紹的詳細解析exit和atexit的區別,這些知識都是非常值得我們去學習的,希望這篇文章能夠幫助到你們。
新聞熱點
疑難解答
圖片精選