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

上节是对资源的管理说明。有时候我们不能依赖于shared_ptr或者auto_ptr,所以我们须要自己建立一个资源管理类来管理自己的资源。

比如建立一个类来管理Mutex锁。如今使用函数处理类型为Mutex的相互排斥器对象

class Lock{
public:explicit Lock(Mutex* mu):mutexPtr(mu){lock(mutexPtr);}~Lock(){unlock(mutexPtr);}
private:Mutex* mutexPtr;
};void lock(Mutex* mu);//加锁
void unlock(Mutex* mu);//解锁Mutex m;//定义相互排斥器
……
{Lock(&m);……
}

以上代码能够完毕对资源的释放,这里的释放对于mutex来说的真正意义就是解锁。而不是销毁。

然而。以上代码是有问题的,比方运行Lock m2(m1);这句话时。我们须要怎么面对?难道就是两个对象交互的操纵mutex?这样做绝对不行,我们不能确定什么时候m2和m1会被析构,一旦被析构就会导致mutex解锁,mutex一旦解锁就会被别的进程所调用,程序将出现巨大的混乱!

解决上述问题一般有下面几种方式:

1、禁止复制
很多情况下,复制RAII对象并不合理。比如Lock类,这时候便能够禁止复制。仅仅需将coping函数设为私有。条款6有讲述

2、对管理资源使用引用计数法。模仿shared_ptr

3、复制底部资源。这里要是深拷贝

4、转移底层资源的拥有权。

模仿auto_ptr.

作者举出另外一种方式的详细操作。例如以下:

class Lock:private Uncopyable{
public:explicit Lock(Mutex* mu):mutexPtr(mu,unlock)//以某个Mutex初始化。unlock作为删除其{lock(mutexPtr);}
private:shared_prt<Mutex> mutexPtr;
};

假设上述Lock类使用引用计数器的话,仅仅需把mutexPrt变为类型从Mutex*变为shared就可以。但shared_ptr默认是当引用计数为0时,删除多指向对象,这不是我们想要的,我们想要的是调用unlock函数。幸运的是在shared_ptr中同意指定“删除器”。即引用计数为0时调用的函数。

转载于:https://www.cnblogs.com/zhchoutai/p/7352624.html

Effective C++ 条款14相关推荐

  1. [Effective C++]条款14:在资源管理类中小心copying行为

    复制 RAII 对象必须一并复制它所管理的资源,所以资源的 copying 行为决定 RAII 对象的 copying 行为 普遍而常见的 RAII class copying 行为是:阻止 copy ...

  2. effective stl 条款15 小心string实现的多样性

    实际上每个string实现都容纳了下面的信息: ● 字符串的大小,也就是它包含的字符的数目. ● 容纳字符串字符的内存容量.(字符串大小和容量之间差别的回顾,参见条款14.) ● 这个字符串的值,也就 ...

  3. Effective STL 条款30

    http://blog.csdn.net/amin2001/article/details/8063 STL容器在被添加时(通过insert.push_front.push_back等)自动扩展它们自 ...

  4. effective c++条款11扩展——关于拷贝构造函数和赋值运算符

    effective c++条款11扩展--关于拷贝构造函数和赋值运算符 作者:冯明德 重点:包含动态分配成员的类 应提供拷贝构造函数,并重载"="赋值操作符. 以下讨论中将用到的例 ...

  5. Effective C++条款09:绝不在构造和析构过程中调用virtual函数

    Effective C++条款09:绝不在构造和析构过程中调用virtual函数(Never call virtual functions during construction or destruc ...

  6. effective c++条款44 将与参数无关的代码抽离templates

    effective c++条款44 将与参数无关的代码抽离templates 首先了解这个条款的含义:使用template可能导致代码膨胀,二进制码会带着重复(或者几乎重复)的代码.数据,或两者.其结 ...

  7. Effective C++ 条款02:尽量使用const,enum,inline替换#define

    Effective C++ 条款02:尽量使用const,enum,inline替换#define 用另一句话说:用编译器代替预处理器比较好. 举个例子:加入定义一个常量: #define ASPEC ...

  8. Effective C++条款05:了解C++默默编写并调用哪些函数(Know what functions C++ silently writes and calls)

    Effective C++条款05:了解C++默默编写并调用哪些函数(Know what functions C++ silently writes and calls) 条款05:了解C++默默编写 ...

  9. Effective C++条款40:明智而审慎地使用多重继承(Use multiple inheritance judiciously)

    Effective C++条款40:明智而审慎地使用多重继承(Use multiple inheritance judiciously) 条款40:明智而审慎地使用多重继承 1.多重继承的两个阵营 2 ...

最新文章

  1. Qt的一个颜色选取按钮QColorButton
  2. 【PAT乙级】1057 数零壹 (20 分)
  3. jdk8 List集合 Stream distinct() 去重代码示例
  4. linux 每日学一点《明明白白配置lilo启动引导器》
  5. 常见Java开发过程中遇到的问题及其解决办法
  6. OpenShift 之 Quarkus(2)使用S2I部署Quarkus应用
  7. Vs2012调试本地windows服务
  8. python数据分析-《Python数据分析与数据化运营》电子版
  9. ArcGIS Desktop10.2与CityEngine2012兼容问题
  10. [原创]Linux下网络性能测试Netperf工具介绍及安装
  11. node的module.exports和exports
  12. PHPWAMP开机自启异常,服务器重启后Apache等服务不会自启的原因分析
  13. linux C语言 SOCKET 服务器断开导致客户端SEND崩溃问题解决办法
  14. python3_fake_User-Agent_创建UA伪装
  15. 八爪鱼数据采集器的使用
  16. 2022完整iOS APP发布App Store上架流程指南
  17. Retrofit2.9.0源码解析
  18. 水表读数图解_水表怎么看,教你轻松看懂水表读数
  19. 【转载】SaaS的行业概述及发展现状
  20. 如何成为数据分析师系列(二):可视化图表进阶

热门文章

  1. 手机没有android,安卓手机数据没了怎么恢复-互盾安卓恢复大师
  2. JAVA:实现十进制转二进制算法(附完整源码)
  3. 解决电脑连上wifi无法上网问题
  4. 百度API加载离线百度电子地图和卫星切片
  5. Vue百度地图电子围栏
  6. java怎么开始编写代码_Java编程入门:开始用Java编写代码
  7. python英汉互译词典下载_python字典如何实现英汉互译
  8. OneNote for Windows 10 笔记丢失踩雷
  9. 2020-10-05
  10. rnnlm源码分析 一