Effective C++之利用std::tr1::shared_ptr指定“刪除器”實現對底層資源“引用計數”
阿新 • • 發佈:2019-02-05
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成員函式,執行顯示轉換,得到智慧指標內部的原始資料(的復件)。