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

2021-08-09 12:27:55 字數 1689 閱讀 3470

// 條款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 不必宣告析...