首先我們了解下atexit函式:
函式名:atexit
標頭檔案:#include
功 能: 註冊終止函式(即main執行結束後呼叫的函式)
原型: void atexit(void (*func)(void));
說明:atexit()用來設定乙個程式正常結束前呼叫的函式. 當程式通過呼叫exit()或從main 中返回時, 引數function 所指定的函式會先被呼叫, 然後才真正由exit()結束程式。
呼叫順序: 在atexit(f)呼叫之前被靜態分配的物件的析構函式將在f()的呼叫之後被呼叫。在乙個atexit(f)呼叫之後建立的這種物件的析構函式將在f的呼叫之前被呼叫。引自《the c++ programming language》(bjarne stroustrup)。
程序終止的方法有8種,如下所示,其中前5種是正常的方法,後面的3種方法是異常終止。
下面看下atexit函式的作用例子:
#include
#include
using
namespace std;
intatexit
(void
(*function)
(void))
;void
func1
(void),
func2
(void),
func3
(void);
intmain
(int argc,
char
* ar**)
void
func1()
void
func2()
void
func3()
執行上面的程式:
發現:首先在main函式返回(return 0;)之後,程式還在繼續執行,並且執行的順序和我們在main函式中登記的順序是相反的。
然後我們分別執行main函式中的exit()、_exit()、 _exit() 函式來終止程序,發現,執行exit()時程式的執行效果跟上面的執行效果是一致的,而_exit()、 _exit() 的執行結果如下所示:
上面的兩種不同的結果,說明:
exit()和_exit()以及_exit()函式的本質區別是是否立即進入核心,_exit()以及_exit()函式都是在呼叫後立即進入核心,而不會執行一些清理處理,但是exit()則會執行一些清理處理,這也是為什麼會存在atexit()函式的原因,因為exit()函式需要執行清理處理,需要執行一系列的操作,這些終止處理函式實際上就是完成各種所謂的清除操作的實際執行體。
atexit函式的作用
很多時候我們需要在程式退出的時候做一些諸如釋放資源的操作,但程式退出的方式有很多種,比如main 函式執行結束 在程式的某個地方用exit 結束程式 使用者通過ctrl c或ctrl break操作來終止程式等等,因此需要有一種與程式退出方式無關的方法來進行程式退出時的必要處理。方法就是用atexi...
atexit函式詳解
對c語言有所了解的人都知道main函式是整個程式的入口,但是其實不然,在核心中可以使用鏈結器來設定程式的開始地方。當核心使 個exec函式執 c程式時,在調 main函式之前先調 個特殊的啟動例程,可執 程式將此例程指定為程式的起始位址。啟動例程從核心獲取命令 引數和環境變數,然後為調 main函式...
atexit 函式呼叫
函式名 atexit 標頭檔案 include 功 能 註冊終止函式 即main執行結束後呼叫的函式 用 法 int atexit void func void 按照iso c的規定,乙個程序可以登記多達32個函式,這些函式將由exit自動呼叫。atexit 註冊的函式型別應為不接受任何引數的voi...