1.什麼是raii 技術?
我們在c++中經常使用new申請了記憶體空間,但是卻也經常忘記delete**申請的空間,容易造成記憶體溢位,於是raii技術就誕生了,來解決這樣的問題。raii(resource acquisition is initialization)機制是bjarne stroustrup首先提出的,是一種利用物件生命週期來控制程式資源(如記憶體、檔案控制代碼、網路連線、互斥量等等)的簡單技術。 我們知道在函式內部的一些成員是放置在棧空間上的,當函式返回時,這些棧上的區域性變數就會立即釋放空間,於是bjarne stroustrup就想到確保能執行資源釋放**的地方就是在這個程式段(棧)中放置的物件的析構函式了,因為stack winding會保證它們的析構函式都會被執行。raii就利用了棧裡面的變數的這一特點。raii 的一般做法是這樣的:在物件構造時獲取資源,接著控制對資源的訪問使之在物件的生命週期內始終保持有效,最後在物件析構的時候釋放資源。藉此,我們實際上把管理乙份資源的責任託管給了乙個存放在棧空間上的區域性物件。
這種做法有兩大好處:
(1)不需要顯式地釋放資源。
(2)採用這種方式,物件所需的資源在其生命期內始終保持有效。
2.實戰應用
2.1乙個簡單的例子:指標申請空間,釋放空間
void func()
使用raii技術後:
templateclass my_pointer
~my_pointer()
protected:
pointertype m_ptr;
}
2.2 scope lock (區域性鎖技術)
在很多時候,為了實現多執行緒之間的資料同步,我們會使用到 mutex,critical section,event,singal 等技術。但在使用過程中,由於各種原因,有時候,我們會遇到乙個問題:由於忘記釋放(unlock)鎖,產生死鎖現象。
採用raii 就可以很好的解決這個問題,使用著不必擔心釋放鎖的問題. 示例**如下:
my_scope_lock 為實現 區域性鎖的模板類.
locktype 抽象代表具體的鎖類 .如基於 mutex 實現 mutex_lock 類.
templateclass my_scope_lock
~my_scope_lock()
protected:
locktype m_lock;
}
使用的時候:
//global vars
int counter = 0;
void routine();
mutex_lock m_mutex_lock;
void routine()
我們可以根據上面的例子類推出好多這樣例子。如讀寫檔案的時候很容易忘記關閉檔案,如果借用 raii技術,就可以規避這種錯誤。再如對資料庫的訪問,忘記斷開資料庫連線等等都可以借助raii 技術也解決。
C 之RAII技術解析(資源 狀態管理)
原文 raii技術被認為是c 中管理資源的最佳方法,進一步引申,使用raii技術也可以實現安全 簡潔的狀態管理,編寫出優雅的異常安全的 raii是c 的發明者bjarne stroustrup提出的概念,raii全稱是 resource acquisition is initialization 直...
C 之RAII慣用法
c 中的raii全稱是 resource acquisition is initialization 直譯為 資源獲取就是初始化 但是這翻譯並沒有顯示出這個慣用法的真正內涵。raii的好處在於它提供了一種資源自動管理的方式,當產生異常 回滾等現象時,raii可以正確地釋放掉資源。舉個常見的例子 在資...
C 之RAII慣用法
c 中的raii全稱是 resource acquisition is initialization 直譯為 資源獲取就是初始化 但是這翻譯並沒有顯示出這個慣用法的真正內涵。raii的好處在於它提供了一種資源自動管理的方式,當產生異常 回滾等現象時,raii可以正確地釋放掉資源。舉個常見的例子 cp...