并非所有的资源都是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.