RAII 資源獲取是初始化

RAII 代表 - [R esource 一個 cquisition S nitialization。有時也稱為 SBRM(基於範圍的資源管理)或 RRID(資源釋放是銷燬),RAII 是用於將資源與物件生存期聯絡起來的習慣用法。在 C++中,物件的解構函式總是在物件超出範圍時執行 - 我們可以利用它來將資源清理與物件銷燬聯絡起來。

每當你需要獲取最終需要釋放的某些資源(例如鎖,檔案控制代碼,分配的緩衝區)時,你應該考慮使用物件來為你處理該資源管理。無論異常或早期作用域退出,都會發生堆疊展開,因此資源處理程式物件將為你清理資源,而無需仔細考慮所有可能的當前和未來程式碼路徑。

值得注意的是,RAII 並沒有完全釋放開發人員思考資源的生命週期。顯然,一種情況是崩潰或 exit() 呼叫,這將阻止解構函式被呼叫。由於作業系統將在程序結束後清理程序本地資源(如記憶體),因此在大多數情況下這不是問題。但是,對於系統資源(即命名管道,鎖定檔案,共享記憶體),你仍然需要設施來處理程序在自身之後沒有清理的情況,即在啟動測試時是否存在鎖定檔案,如果是,驗證具有 pid 的程序實際存在,然後相應地採取行動。

另一種情況是當 unix 程序從 exec-family 呼叫一個函式時,即在 fork-exec 之後建立一個新程序。這裡,子程序將擁有父物件記憶體的完整副本(包括 RAII 物件),但是一旦呼叫了 exec,就不會在該程序中呼叫任何解構函式。另一方面,如果程序是分叉的,並且兩個程序都沒有呼叫 exec,則在兩個程序中都會清除所有資源。這對於在 fork 中實際複製的所有資源都是正確的,但是對於系統資源,兩個程序都只有對資源的引用(即鎖檔案的路徑),並且都會嘗試單獨釋放它,可能導致另一個失敗的過程。