Item 14 資源管理類的拷貝

2021-08-25 19:57:29 字數 820 閱讀 7358

raii物件只能管理堆上new出來的資源,其它的不行。比如下面的mutex:

void lock(mutex *pm); // lock mutex pointed to by pm void unlock(mutex *pm); // unlock the mutex

只能自定義乙個資源管理類,來管理這個mutex資源,以防止它被意外地忽略。

class lock // acquire resource ~lock() // release resource private: mutex *mutexptr; };

使用方法如下:

mutex m; // define the mutex you need to use ... // automatically unlock mutex at end of block

如果拷貝乙個raii資源,會發生什麼?

lock ml1(&m); lock ml2(ml1);

一般的處理方式:

1> 因為有的拷貝raii資源無意義,比如lock。所以禁止拷貝:

class lock: private uncopyable ;

2> 如果拷貝有意義,那麼用「引用計數」機制。使用tr1::shared_ptr即可:

class lock private: std::tr1::shared_ptrmutexptr; };

在mutexptr的ctor裡指定unlock作為計數器歸零時要做的「**資源」操作。

lock不需要再定義dtor。編譯器會自動生成。

3> 有時要求只能有乙個管理器指向資源,那麼可在拷貝時轉移所有權。auto_ptr就是這麼做的。

Item 14 資源管理類的拷貝

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

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

例如,假設你使用 c api 提供的 lock 和 unlock 函式去操縱 mutex 型別的互斥體物件 void lock mutex pm void unlock mutex pm 為了確保你從不會忘記解鎖乙個被你加了鎖的 mutex,你希望建立乙個類來管理鎖。raii 原則規定了這樣乙個類的...

Starling之資源管理類

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