![](/img/trans.png)
[英]What does the POSIX standard say about thread stacks in atexit() handlers? What's the OS practice?
[英]What's the scenario to use atexit function?
CRT函數atexit()
可以在main
函數返回后注冊一個函數來運行。 我想知道使用它的典型場景是什么? 是( atexit
)真的有必要嗎?
我猜它的主要用途是當你無法控制main
,你想確保在它結束時調用某些東西。
它有時被庫使用,它們不希望在終止程序之前,用戶程序明確地調用它們的清理函數。
它也用於鳳凰單身模式(參見Andrei Alexandrescu的Modern C ++ Design)。
它可以用於您需要執行的任務,每當應用程序關閉時。 通過使用它,您不需要在代碼中找到的每個exit()之前添加所有清理代碼來膨脹您的代碼。
一些用例:
atexit
的主要用途之一是庫在程序退出時執行清理。 請注意,調用exit
會調用atexit
, 而不是在程序中止或崩潰時調用,因此您無法對斷言失敗等進行清理。 如果程序調用exec
也不會調用它。
如果你想要的話,你可以直接在主程序中調用它,如果你有一個可能因某種原因調用exit的庫。
請注意,您只能注冊有限數量的atexit
處理程序,其中“limited”取決於您的操作系統,因此它會返回錯誤狀態。
它為C程序提供了類似的能力,可以在C ++中調用靜態變量的析構函數。
我用它來刪除臨時文件,或者(一次或兩次)重置一些硬件寄存器。 通常沒有必要使用它來關閉文件或釋放內存,因為操作系統會為你做這件事。
在編寫庫時...想象一下在崩潰時將堆棧保存在預定義路徑上(或郵件跟蹤)的庫。
編輯 - 正如評論中提到的,這個答案是錯誤的。 不讀它。 太晚了。
可以在atexit()中處理異常.Assume多進程環境。 有一個物理可用的硬件資源。 任何一個進程都可以一次使用該h / w。 現在process1獲取了h / w資源,並且在處理process1之后沒有釋放h / w資源。 為了釋放h / w資源,可以使用此atexit(),以便process2可以有效地獲取h / w。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.