Effective C++ Item 14 在资源管理类中小心copying行为

本文为senlie原创,转载请保留此地址:http://blog.csdn.net/zhengsenlie


建立自己的资源管理类

示例:互斥量的资源管理类

void lock(Mutex *pm);//锁定pm所指的互斥器
void unlock(Mutex *pm); //将互斥器解除锁定

class Lock{
public:
	explicit Lock(Mutext *pm) : mutexPtr(pm){lock(mutexPtr);} //获得资源
	~Lock(){unlock(mutexPtr);}
private:
	Mutex *mutexPtr;
}

客户对Lock的用法

Mutex m;//定义你需要的互斥器
{			//建立一个区块用来定义critical section
	Lock ml(&m);    //锁定互斥器
	//…		//执行critical section内的操作
}			//在区块最末尾,自动解除互斥器锁定

经验:复制RAII对象必须一并复制它所管理的资源,所以资源的copying行为决定RAII对象的copying行为。

普遍而常见的RAII classcopying行为是:抑制copying,施行引用计数法(reference counting)。不过其他行为也都可能被实现。

示例1:抑制copying

class Lock: private Uncopyable{ //Uncopyable的copying函数是私有的
public:
}
示例2:施行引用计数法

class Lock{
public:
	explicit Lock(Mutex *): mutexPtr(pm, unlock)//	以某个Mutex初始化shared_ptr,并											// unlock函数为删除器
	{
		lock(mutexPtr.get());
	}
private:
	std::tr1::shared_ptr<Mutex> mutexPtr;//使用shared_ptr替代raw pointer
}



你可能感兴趣的:(Effective C++ Item 14 在资源管理类中小心copying行为)