條款14 在資源管理類中小心coping行為

2021-06-22 06:24:39 字數 1593 閱讀 8976

條款14:在資源管理類中小心coping行為

在前乙個條款,我們提出了raii(資源獲得即是初始化)技術,通過「物件管理資源」達到防止資源洩露,對於通過堆分配的記憶體,可以借助指標指標實現

,但系統中有很多資源不是堆分配:檔案控制代碼,鎖,網路套接字。這些資源就需要自己實現物件來管理。

看乙個簡單的實現互斥鎖資源物件管理

class mutex{};

void lock(mutex* mutex) {} //鎖住資源

void unlock(mutex* mutex) {} //釋放資源

class mylock

~mylock()

private:

mutex *m_mutex;

};

呼叫

void process()

//離開作用域,mylock執行析構函式,釋放mutex

管理物件被複製了,會出現什麼情況?

void process()

//離開作用域,mylock和mylock2執行析構函式,釋放mutex兩次

如何解決raii物件被複製的情況呢?

①禁止複製;可以通過條款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 不過其他行...