生活随笔
收集整理的這篇文章主要介紹了
0.C++之RAII技术解析
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
1.什么是RAII 技術?
我們在C++中經常使用new申請了內存空間,但是卻也經常忘記delete回收申請的空間,容易造成內存泄露,于是RAII技術就誕生了,來解決這樣的問題。RAII(Resource Acquisition Is Initialization)機制是Bjarne Stroustrup首先提出的,是一種利用對象生命周期來控制程序資源(如內存、文件句柄、網絡連接、互斥量等等)的簡單技術。 我們知道在函數內部的一些成員是放置在棧空間上的,當函數返回時,這些棧上的局部變量就會立即釋放空間,于是Bjarne Stroustrup就想到確保能運行資源釋放代碼的地方就是在這個程序段(棧)中放置的對象的析構函數了,因為stack winding會保證它們的析構函數都會被執行。RAII就利用了棧里面的變量的這一特點。RAII 的一般做法是這樣的:在對象構造時獲取資源,接著控制對資源的訪問使之在對象的生命周期內始終保持有效,最后在對象析構的時候釋放資源。借此,我們實際上把管理一份資源的責任托管給了一個存放在棧空間上的局部對象。
這種做法有兩大好處:?
(1)不需要顯式地釋放資源。?
(2)采用這種方式,對象所需的資源在其生命期內始終保持有效。
2.實戰應用
2.1一個簡單的例子:指針申請空間,釋放空間
?
[cpp] view plain copy print?
void?Func()??{????int?*ip?=?new?int[10];????...//operations????...//operations????...//operations????delete[]?ip;//if?not?free?mem,?memory?overflow??}??
void Func()
{int *ip = new int[10];...//operations...//operations...//operationsdelete[] ip;//if not free mem, memory overflow
}
使用RAII技術后:
?
?
[cpp] view plain copy print?
template<class?PointerType>??class?My_Pointer??{??public:?????My_Pointer(PointerType*?_ptr,?size_t?sz)?????{??????????_ptr?=?new?PointerType[sz];??????????m_ptr?=?_ptr;?????}?????~My_Pointer()?????{??????????delete?[]m_ptr;?????}??protected:?????PointerType????m_ptr;??}??
template<class PointerType>
class My_Pointer
{
public:My_Pointer(PointerType* _ptr, size_t sz){_ptr = new PointerType[sz];m_ptr = _ptr;}~My_Pointer(){delete []m_ptr;}
protected:PointerType m_ptr;
}
2.2 scope lock (局部鎖技術)
在很多時候,為了實現多線程之間的數據同步,我們會使用到 mutex,critical section,event,singal 等技術。但在使用過程中,由于各種原因,有時候,我們會遇到一個問題:由于忘記釋放(Unlock)鎖,產生死鎖現象。
采用RAII 就可以很好的解決這個問題,使用著不必擔心釋放鎖的問題. 示例代碼如下:
My_scope_lock 為實現 局部鎖的模板類.
LockType 抽象代表具體的鎖類 .如基于 mutex 實現 mutex_lock 類.
?
[cpp] view plain copy print?
template<class?LockType>??class?My_scope_lock??{?????public:?????My_scope_lock(LockType&?_lock):m_lock(_lock)?????{????????????m_lock.occupy();?????}?????~My_scope_lock()?????{??????????m_lock.relase();?????}?????protected:?????LockType????m_lock;??}??
template<class LockType>
class My_scope_lock
{public:My_scope_lock(LockType& _lock):m_lock(_lock){ m_lock.occupy();}~My_scope_lock(){m_lock.relase();}protected:LockType m_lock;
}
使用的時候:
?
[cpp] view plain copy print?
//global?vars??int?counter?=?0;??void?routine();??mutex_lock??m_mutex_lock;????void?routine()??{??????My_scope_lock?l_lock(m_mutex_lock);??????counter++;??????...//others...??}??
//global vars
int counter = 0;
void routine();
mutex_lock m_mutex_lock;void routine()
{My_scope_lock l_lock(m_mutex_lock);counter++;...//others...
}
我們可以根據上面的例子類推出好多這樣例子。如讀寫文件的時候很容易忘記關閉文件,如果借用 RAII技術,就可以規避這種錯誤。再如對數據庫的訪問,忘記斷開數據庫連接等等都可以借助RAII 技術也解決。
對象在構造的時候獲取資源,在析構的時候釋放資源,在整個對象周期內使用資源,對象生命周期結束,資源得到釋放。
總結
以上是生活随笔為你收集整理的0.C++之RAII技术解析的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。