Item 14 資源管理類要特別注意拷貝行為

2022-05-28 04:39:09 字數 1168 閱讀 2429

例如,假設你使用 c api 提供的 lock 和 unlock 函式去操縱 mutex 型別的互斥體物件:

void lock(mutex *pm); 

void unlock(mutex *pm);

為了確保你從不會忘記解鎖乙個被你加了鎖的 mutex,你希望建立乙個類來管理鎖。raii 原則規定了這樣乙個類的基本結構,通過建構函式獲取資源並通過析構函式釋放它:

class lock  

~lock()

private:

mutex *mutexptr;

};

客戶按照 raii 風格的慣例來使用 lock:

mutex m;     

...

這沒什麼問題,但是如果乙個 lock 物件被拷貝應該發生什麼?

lock ml1(&m);   

lock ml2(ml1);

每乙個 raii 類的作者都要面臨這樣的問題:當乙個 raii 物件被拷貝的時候應該發生什麼?大多數情況下,你可以從下面各種可能性中挑選乙個:

class lock: private uncopyable ;
shared_ptr 允許乙個 "deleter" 規範——當引用計數變為 0 時呼叫的乙個函式或者函式物件。(這一功能是 auto_ptr 所沒有的,auto_ptr 總是刪除它的指標。)deleter 是 shared_ptr 的建構函式的可選的第二個引數,所以,**看起來就像這樣:

class lock 

private:

shared_ptrmutexptr;

};

在這個例子中,注意 lock 類是如何不再宣告乙個析構函式的。那是因為它不再需要。在本例中,就是 mutexptr。但是,當互斥體的引用計數變為 0 時,mutexptr 的析構函式會自動呼叫的是 shared_ptr 的 deleter ,在此就是 unlock。

某些標準 string 型別的實現是由堆記憶體的指標組成,堆記憶體中儲存著組成那個 string 的字元。這樣的字串物件包含指向堆記憶體的指標。當乙個 string 物件被拷貝,這個副本應該由那個指標和它所指向的記憶體組成。這樣的 string 表現為深拷貝。

Item 14 資源管理類的拷貝

raii物件只能管理堆上new出來的資源,其它的不行。比如下面的mutex 只能自定義乙個資源管理類,來管理這個mutex資源,以防止它被意外地忽略。使用方法如下 如果拷貝乙個raii資源,會發生什麼?一般的處理方式 1 因為有的拷貝raii資源無意義,比如lock。所以禁止拷貝 2 如果拷貝有意義...

Item 14 資源管理類的拷貝

raii物件只能管理堆上new出來的資源,其它的不行。比如下面的mutex void lock mutex pm lock mutex pointed to by pm void unlock mutex pm unlock the mutex 只能自定義乙個資源管理類,來管理這個mutex資源,以...

Starling之資源管理類

分享 概述每個遊戲或應用都必須有若干的資源 無論是紋理,聲音,位 字,或其它各種物件。這些資源可以是嵌入的 可以理解為所有資源都在乙個檔案的瀏覽器遊戲 或隨遊戲進行的 適用於手機遊戲儲存ram需要嵌入物件 在如何引入資源以不同的方式訪問它們有許多選擇。assetmanager幫助你做到這些。它是允許...