// 條款14: 在資源管理類中小心copy行為
// 1.複製raii物件必須一併複製它所管理的資源,所以資源的copying行為決定raii物件的copying行為。
// 2.普遍而常見的raii class copying行為是:抑制copying、施行引用計數法(reference counting)。
// 不過其他行為也都可能被實現。
#include #include class uncopyable
~uncopyable()
private:
uncopyable(uncopyable& );
uncopyable& operator=(uncopyable&);
};// 互斥器物件
class mutex ;
// 鎖定pm所指的互斥器
void lock(mutex* pm);
// 將互斥器解除鎖定,並不是將互斥器銷毀,只是解除鎖定
void unlock(mutex* pm);
// 建立乙個類來管理鎖,採用raii守則,資源獲取時就是初始化時機,也就是
// 「資源在構造期獲得,在析構期釋放」。在這裡是互斥器物件在管理類構造期加鎖,
// 在管理類析構期解鎖。
// 這樣做的目的是,建立乙個管理類來管理某個物件是其自動做某些行為,而不單單是
// 銷毀資源釋放記憶體等。所以可以用指標來管理這類,管理這個物件的行為。
class lock
~lock()
private:
mutex* mutex_ptr_;
};// 3.一般當乙個raii物件被複製,大多數時候採用以下兩種選擇:
// (a)禁止複製,因為許多時候允許raii物件被複製並不合理。
class lock1 : public uncopyable ;
// (b)對底層資源祭出「引用計數法(refrence-count)」。這樣做的目的是,希望保有資源,
// 直到它的最後乙個使用者被銷毀時才釋放該資源。
// 我們的實現方法可以使用tr1::shared_ptr成員變數。但是tr1::shared_ptr的預設行為是
// 「當引用次數為0的時候刪除某物」而我們要的行為是unlock某物。幸運的是,tr1::shared_ptr
// 允許指定「刪除器」,y也就是指定刪除行為,將其刪除行為變為我們想要的行為。
class lock2
// 不必定義析構函式,因為class析構函式(不論是編譯器生成,還是使用者自定義的)
// 總是會自動呼叫其non-static成員變數的析構函式。所以mutex_ptr_的析構函式
// 會在互斥器的引用次數為0時自動呼叫tr1::shared_ptr的刪除器
private:
std::tr1::shared_ptrmutex_ptr_; // 使用shared_ptr來替換raw_pointer。
};// 4.以下兩種解決方法也可能出現
// (a)複製底部資源,也就是深拷貝。
// (b)轉移底部資源的擁有權,就像auto_ptr一樣,誰複製了,這個資源就歸誰。
int main()
// 但是如果發生如下行為會怎麼樣?該物件會被unlock兩次,因為這樣的淺拷貝,會直接指標賦值。
return 0;
}
條款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行為
raii物件被複製時的幾種選擇 前兩種最常用 禁止複製 class a private uncopyable 引用計數,複製時將資源的 被引用數 遞增。raiiclass包含乙個shared ptr成員變數即可。shared ptr可以定製刪除器,即當引用為0時觸發。class lock 不必宣告析...