1. 程式人生 > >Effective C++之利用std::tr1::shared_ptr指定“刪除器”實現對底層資源“引用計數”

Effective C++之利用std::tr1::shared_ptr指定“刪除器”實現對底層資源“引用計數”

Effective C++之利用std::tr1::shared_ptr實現對底層資源“引用計數”

tr1::shared_ptr的預設行為是“當引用次數為0時刪除其所指物”,但對於有些資源,我們並不是想刪除,而是別的其他操作。

例如mutex,當引用次數為0時,我們想要的釋放動作是解鎖而不是刪除。

所幸tr1::shared_ptr允許指定“刪除器”,當引用次數為0時被呼叫。刪除器對tr1::shared_ptr建構函式而言是可有可無的第二個引數

class Lock
{
public:
	explicit Lock(Mutex * pm)//以某個Mutex初始化shared_ptr
		:mutexPtr(pm,unlock)//並以unlock函式為刪除器
	{
		Lock(mutexPtr.get());
	}
private:
	std::tr1::shared_ptr<Mutex> mutexPtr;
};

Lock class不再宣告解構函式,因為沒有必要。class解構函式會自動呼叫其non-static成員變數的解構函式,本例為mutexPtr.而mutexPtr的解構函式會在互斥器的引用次數為0時自動呼叫tr1::shared_ptr的刪除器,本例為unlock.

那麼看這句

Lock(mutexPtr.get());
這是利用tr1::shared_ptr和auto_ptr的get成員函式,執行顯示轉換,得到智慧指標內部的原始資料(的復件)。