条款14:在资源管理类中小心 copying 行为
Think carefully about copying behavior in resource-managing classes.
为什么要实现资源管理类
并非所有的资源都是 heap-based,而对于此类资源,智能指针可能不适合作为资源掌管者(resource handlers),例如互斥锁资源:
class Lock {
public:
explicit Lock(Mutex* pm): mutexPtr(pm) {
lock(mutexPtr); // 获得资源;
}
~Lock() {
unlock(mutexPtr); // 释放资源;
}
};
资源管理类的复制问题
一般解决方法有以下几种:
禁止复制;
对底层资源使用引用计数法:通常只要内含一个
tr1::shared_ptr
成员变量,就可以实现引用计数;其中引用计数型智慧指针允许指定删除器(deleter,一个函数或者函数对象),当引用次数为 0 时便被调用;
class Lock {
public:
explicit Lock(Mutex* pm): mutexPtr(pm, unlock) {
lock(mutexPtr.get());
}
private:
std::tr1:shared_ptr<Mutex> mutexPtr;
};
复制底部资源;
转移底部资源的拥有权;
Last updated
Was this helpful?