条款14 在资源管理类中小心coping 行为

#include<iostream>
#include<memory>
using namespace std;
class Mutex{

};
	void lock(Mutex*pm){
		cout << "locked " << endl;
	}
	void unlock(Mutex*pm){
		cout << "unlocked" << endl;
	}

class Lock{
public:
	explicit Lock(Mutex*pm) :mutexPtr(pm){
		lock(mutexPtr);
	}
	~Lock(){
		unlock(mutexPtr);
	}
private:
	Mutex *mutexPtr;
};
//---------------------禁止复制
class Uncopyable{
protected:
	Uncopyable(){}//允许子类对象构造析构
	~Uncopyable(){}
private:
	Uncopyable(const Uncopyable&);//阻止
	Uncopyable&operator=(const Uncopyable&);
};
class Lock1 :private Uncopyable{
public:
	explicit Lock1(Mutex*pm) :mutexPtr(pm){
		lock(mutexPtr);
	}
	~Lock1(){
		unlock(mutexPtr);
	}
private:
	Mutex *mutexPtr;
};
//-----------------引用计数法
class Lock2{
public:
	explicit Lock2(Mutex*pm) :mutexPtr(pm,unlock){
		lock(mutexPtr.get());
	}
	//不需要析构 mutexPrt的析构函数会在互斥器的引用次数为0时自动调用shared_ptr的删除器 (unlock)
private:
	shared_ptr<Mutex>mutexPtr;
};
void test(Mutex &m){
	//-------------引用计数法
	Lock2 m5(&m);
	Lock2 m6(m5);
}
int main(){
	Mutex m;
	//..
	/*{
		Lock ml(&m);
	}//右括号执行完毕自动解锁 but 
	Lock ml1(&m);
	Lock ml2(ml1);//出现了两把锁
	//--------------禁止复制
	Lock1 m3(&m);
	//Lock1 m4(m3);用不了了
	//-------------引用计数法
	Lock2 m5(&m);
	Lock2 m6(m5);*/
	test(m);
	//复制资源管理对象时 要进行深拷贝
	// auto_ptr可以保证 只有一个RAII对象指向一个未加工资源
	system("pause");
	return 0; 
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值