您的位置:首页 > 编程语言 > C语言/C++

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

2014-05-24 22:28 435 查看
本文为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
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: