以资源管理对象的时候小心copying行为。
上一节我们讲了以资源来管理函数,显然如果有一个互斥器,我们很容易写出这样的代码。
class Lock
{
public:
Lock(Mutex* p):PMutex(p)
{
lock(pMutex);
}
~Lock()
{
unlock(pMutex);
}
private:
Mutex* pMutex;
}
但是显然当我们的类被复制的时候,这种做法就是有问题的:
Mutex m
Lock m1(&m);
Lock m2(&m1);
解决copy问题的两种手段:
1.禁止copy行为
2.采用reference counting的手法 也就是引用计数。通常在类里面内含一个shared_ptr 并定制shared_ptr的回调函数.
具体的做法见一下两段代码:
class Lock:private uncopyable
{
...
}
class Lock
{
public:
Lock(Mutex* p):pMutex(p,unlock)
{
lock(pMutex.get());
}
private:
shared_ptr<Mutex> pMutex;
}