条款十四 在资源管理类中小心copying行为

 

1.auto_ptr和shared_ptr只是适合用于管理heap(堆)上的内存,即动态分配的内存,但不是所有的资源都在heap上
所有这两个智能指针并不适合用于资源管理,所有需要建立自己的资源管理类

2.lock和unlock管理互斥对象Mutex的指针
void lock(Mutex *pm)
void unlock(Mutex *pm)
希望在构造函数时调用lock(),在析构时调用unlock(),所有构建一个类

class MagMutex
{
public:
  MagMutex(Mutex *pm):pClassM(pm)
  {
    lock(pClassM);
  } 

  ~MagMutex(Mutex *pm)
  {
    unlock(pClassM);
  }
private:
  Mutex *pClassM;
};

 

这样的一个初始化时分配资源的类,对于对象使用拷贝函数时无法预定会发生什么情况
MagMutex m1(&pm);
MagMutex m2(m1); //不知道会发生什么情况

可以使用2种方法解决
(1) 禁止复制:将拷贝函数定义为private类型
(2) 使用"引用计数法":如tr1::shared_ptr

3.能否使用tr1::shared_ptr ?
如果把 Mutex * 改为shared_ptr<Mutex>,但是shared_ptr在引用次数为0时删除其所指的事物,而我们需要的是释放所指的事物(调用unlock())
还好,shared_ptr提供了删除器(auto_ptr没有),使用第二参数,是一个函数或者一个对象,当计数为0时被调用

 

posted @ 2012-08-06 23:02  bizhu  阅读(215)  评论(0编辑  收藏  举报