條款14:在資源管理類中小心coping行為
在前乙個條款,我們提出了raii(資源獲得即是初始化)技術,通過「物件管理資源」達到防止資源洩露,對於通過堆分配的記憶體,可以借助指標指標實現
,但系統中有很多資源不是堆分配:檔案控制代碼,鎖,網路套接字。這些資源就需要自己實現物件來管理。
看乙個簡單的實現互斥鎖資源物件管理
呼叫class mutex{};
void lock(mutex* mutex) {} //鎖住資源
void unlock(mutex* mutex) {} //釋放資源
class mylock
~mylock()
private:
mutex *m_mutex;
};
管理物件被複製了,會出現什麼情況?void process()
//離開作用域,mylock執行析構函式,釋放mutex
如何解決raii物件被複製的情況呢?void process()
//離開作用域,mylock和mylock2執行析構函式,釋放mutex兩次
①禁止複製;可以通過條款6的方法禁止類物件複製
class mylock : private uncopyable {};
②對底層使用「引用計數法」
使用shared_ptr成員變數,指向需要管理的資源,當引用計數為0時則delete掉資源,但非堆分配記憶體是不能delete操作,只需要釋放,為此,shared_ptr提供一種方法,即刪除器,在引用計數為0時執行
呼叫class mutex{};
void lock(mutex* mutex) {} //鎖住資源
void unlock(mutex* mutex) {} //釋放資源
class mylock
//~mylock() //不用再定義析構函式,直接通過m_mutexptr刪除器釋放資源
private:
std::tr1::shared_ptrm_mutexptr;
};
③複製底部資源void process()
//離開作用域,成員物件mylock和mylock2的智慧型指標物件都執行析構函式且引用計數減為0,則呼叫刪除器unlock()函式解除鎖
有些時候可以對某些資源進行多份拷貝,如常用的string類,實現方法是前面說過的深拷貝
④轉移底部資源的擁有權。
前面說過的auto_ptr就是採用這種技術.
記住
①複製raii物件必須一併複製它所管理的資源,所以資源的copying行為決定raii物件的copying行為.
②普遍而常見的raii class copying行為是:抑制copying、施行引用計數法.不過其它行為也都可能被實現.
條款14 在資源管理類中小心copying行為
結論1 複製raii物件必須一併複製它所管理的資源,所以資源的copying行為決定raii物件的copying行為。結論2 普遍而常見的raii class copying行為是 1 抑制copying,即禁止複製 很多時候允許raii物件被複製是不合理的。2 對底層資源施行引用計數法 在此情況下...
條款14 在資源管理類中小心copying行為
總結 條款13介紹了作為資源管理類支柱的 resource acquisition isinitialization raii 原則,並描述了 auto ptr 和 tr1 shared ptr 在基於堆的資源上運用這一原則的表現。然而,並非所有的資源都是基於堆的,對於這樣的資源,像 auto pt...
條款14 在資源管理類中小心copying行為
條款14 在資源管理類中小心copy行為 1.複製raii物件必須一併複製它所管理的資源,所以資源的copying行為決定raii物件的copying行為。2.普遍而常見的raii class copying行為是 抑制copying 施行引用計數法 reference counting 不過其他行...