《Effective C++》条款14

在资源管理类中小心copying行为

你写了一个用来管理锁的RAII对象:

class Lock
{
public:
	Lock(mutex* m):mtx(m)
	{
		mtx->lock();
	}
	~Lock()
	{
		mtx->unlock();
	}
private:
	mutex* mtx;
};

关于拷贝RAII对象,你应该考虑这些:

1.禁止复制。

将copying操作声明为private

2.对底层资源祭出“引用计数法”。

一般的操作是引入智能指针shared_ptr。当计数减为0时才释放资源。但是在这个例子中,我们往往想的是在出了对象作用域后进行解锁而不是直接删除该对象,但是智能指针是直接删除。所以我们需要允许指定所谓的“删除器”,那是一个函数或者函数对象,当引用次数为0时便调用。删除器对于shared_ptr来说是可有可无的第二参数:

class Lock
{
public:
	Lock(mutex* m):mtx(m,unlock) // 以unlock函数为删除器
	{
		mtx.get()->lock();
	}
private:
	shared_ptr mtx;
};

此时这个类并不用声明析构函数,因为没有必要。析构函数会在互斥器的计数为0的时候自动调用shared_ptr的删除器。

3.复制底层资源

简单来说就是进行深度拷贝(deep copying)

4.转移底部资源的拥有权

某些罕见场合下你可能希望确保永远只有一个RAII对象指向一个未加工资源,即使RAII对象被复制依然如此。此时资源的拥有权会从被复制物转移到目标物。

 

你可能感兴趣的:(c++,开发语言)