条款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?