当前位置: 首页 > news >正文

Effective C++笔记(三):资源管理

      参考:http://www.cnblogs.com/ronny/p/3745098.html

      资源:动态分配的内存、文件描述器、互斥锁、图形界面中的字型与笔刷、数据库连接以及网络sockets等,

      无论哪一种资源,重要的是,当你不再使用它时,必须将它还给系统。      

    条款13:以对象管理资源

     当我们向系统申请资源后,一定要记得释放,不然就容易发生内存泄漏,但是意识到这样一件事并不是很容易

     解决方法是我们把指针放在一个资源管理的类里,让类对象在生命结束的时候,会自动调用析构函数,而析构函数里会执行delete。

     两个常被使用的RAII类分别是:shared_ptr和unique_ptr,它们间不同的是shared_ptr允许存在同一内存区域的多个指针拷贝,

     而unique_ptr只允许一份指针指向对象,当uniuqe_ptr发生赋值操作时,用于赋值的指针将会变成null。   

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

      在实际管理资源时,并非所有的资源都是堆内存(heap),所以unique_ptr或shared_ptr这样的智能指针往往不适合作为资源管理者。

     比如你需要控制类型为Mtux的互斥器对象,共有lock和unlock两函数可用,你需要保证的就是不要忘记将一个被锁住的Mutex解锁,

      我们的想法的主旨就是:资源在构造期间创建,在析构期间释放。   

     这样虽然很好,但是如果Lock被复制了,就会发生问题。它可能会引起对了一Mutex解锁两次。

     常见的解决方案有2种:一种是禁止复制;第二种是对底层资源祭出“引用计数法”,这也是shared_ptr实现原理。 

    条款15:在资源管理类中提供对原始资源的访问     

     很多API接口往往要求访问原始资源,所以每一个RAII class应该提供一个“取得其所管理之资源”的办法,比如提供一个get函数。

    对原始资源的访问可能经由显式转换或隐式转换。一般而言显式转换比较安全,但隐式转换对客户比较方便。

   条款16:成对使用new和delete时要采用相同形式

    如果你在new表达式中使用[],必须在相应的delete表达式中使用[]。如果你在new表达式中不使用[],一定不要在相应的delete表达式中使用[]。

  条款17:以独立语句将newed对象置入智能指针

     以独立语句将newed对象置于智能指针内,防止发生内存泄露。

  

 

转载于:https://www.cnblogs.com/573177885qq/p/5404876.html

相关文章:

  • IOS开发之远程推送
  • Set的用法
  • 安卓手持智能POS端上能扫描开单的软件-店面销售开单系统
  • 等式 hash
  • ARDUINO W5100 WebClient 测试
  • iOS9横竖屏设置的处理方法
  • spark 性能优化
  • 第一阶段冲刺个人博客08
  • 【代码笔记】iOS-轮询弹出框
  • 圆角矩形“RoundRectShape”使用详解
  • Javascript异步编程的4种方法
  • [APIO2015]巴厘岛的雕塑
  • HTTP原理
  • javascript中利用柯里化函数实现bind方法
  • theano和keras使用过程中遇到的一些问题记录
  • Android组件 - 收藏集 - 掘金
  • css布局,左右固定中间自适应实现
  • Fabric架构演变之路
  • HTTP请求重发
  • Java,console输出实时的转向GUI textbox
  • Mac 鼠须管 Rime 输入法 安装五笔输入法 教程
  • MaxCompute访问TableStore(OTS) 数据
  • Objective-C 中关联引用的概念
  • React+TypeScript入门
  • 从0实现一个tiny react(三)生命周期
  • 解决iview多表头动态更改列元素发生的错误
  • 排序(1):冒泡排序
  • 设计模式走一遍---观察者模式
  • 世界编程语言排行榜2008年06月(ActionScript 挺进20强)
  • gunicorn工作原理
  • LIGO、Virgo第三轮探测告捷,同时探测到一对黑洞合并产生的引力波事件 ...
  • 支付宝花15年解决的这个问题,顶得上做出十个支付宝 ...
  • ![CDATA[ ]] 是什么东东
  • # MySQL server 层和存储引擎层是怎么交互数据的?
  • #stm32整理(一)flash读写
  • $NOIp2018$劝退记
  • (01)ORB-SLAM2源码无死角解析-(56) 闭环线程→计算Sim3:理论推导(1)求解s,t
  • (2)(2.10) LTM telemetry
  • (39)STM32——FLASH闪存
  • (Demo分享)利用原生JavaScript-随机数-实现做一个烟花案例
  • (第9篇)大数据的的超级应用——数据挖掘-推荐系统
  • (机器学习的矩阵)(向量、矩阵与多元线性回归)
  • (欧拉)openEuler系统添加网卡文件配置流程、(欧拉)openEuler系统手动配置ipv6地址流程、(欧拉)openEuler系统网络管理说明
  • (转载)Google Chrome调试JS
  • (转载)Linux 多线程条件变量同步
  • (最完美)小米手机6X的Usb调试模式在哪里打开的流程
  • ./configure,make,make install的作用(转)
  • .NET处理HTTP请求
  • .net的socket示例
  • .NET教程 - 字符串 编码 正则表达式(String Encoding Regular Express)
  • /ThinkPHP/Library/Think/Storage/Driver/File.class.php  LINE: 48
  • @ConditionalOnProperty注解使用说明
  • @data注解_一枚 架构师 也不会用的Lombok注解,相见恨晚
  • []我的函数库
  • [BZOJ2208][Jsoi2010]连通数