并非所有的資源都是heap-based,對于這種資源而言,像auto_ptr和tr1::share_ptr這樣的智能指針往往不适合作為資源掌管者。這個時候我們需要建立自己的資源管理類。
基礎代碼:
//RAII守則
class Lock{
public:
explicit Lock(Mutex* pm):mutexPtr(pm){
lock(mutexPtr);
}
~Lock(){
unLock(mutexPtr);
}
private:
Mutex* mutexPtr;
};
//使用
Mutex m;
...
{
...
Lock ml(&m);//自動鎖定mutex
... //區塊結束時自動釋放mutex
}
問題:如果對象被複制,會發生什麼情況?
Lock m1(&m);
Lock m2(m1);
解決:1、禁止複制,參見條款6。2、“引用計算法”
class Lock{
public:
explicit Lock(Mutex* pm):mutexPtr(pm,unLock){
lock(mutexPtr_.get()); //條款15談GET
}
private:
std::tr1::shared_ptr<Mutex > mutexPtr;
};
注意:
1、複制底部資源,複制資源管理對象時,進行深度複制,如字元串對象内含一個指針指向一塊HEAP記憶體。
2、轉移底部資源的擁有權。參見條款13.