C++中的资源管理非常重要,在将资源加载到内存后,便可以使用资源了,当我们不再需要资源时,我们要保证其正确的释放,才能将其占用的内存空间归还给操作系统,不正确的释放很容易造成内存泄漏。本章以资源管理类为基础,提出了以下几条准则,这章内容比较简单,大概总结一下:

13. 以对象管理资源

绝大多数资源都是动态分配于堆内存之中,然后被用于某个局部范围区域内。这类资源应该在控制流离开该区域时被释放,或者全局资源在退出main函数时也应该释放。通常我们用new创建一个堆对象,最在使用完对象后用delete完成销毁释放,在创建后销毁前期间,如果发生函数提前退出或者对象指针被重置,则相应的堆内存就无法释放了。智能指针是一种指针管理类,它可以执行几乎所有裸指针能执行的操作,而且智能指针在离开作用域时会自动调用所指对象的析构函数,所以用智能指针对象来管理资源的指针是一个非常好的选择。一个很简明的原则就是:资源获取时便进行初始化————RAII。即一个获取的资源在获得时就应该被放进资源管理类(智能指针)中,并在资源管理类析构的时候完成资源释放。例如:std::shared_ptr<OneClass> p_oneclass(new OneClass(666)),这种写法能够保证在适当的时候正确释放对象。

PS:当然,无脑使用智能指针也不好,在调试代码的时候,无法直接看到智能指针所指对象的成员状态,不利于修bug。

14. 在资源管理类中小心copy行为

如果需要复制RAII对象,那么也请完全复制其管理的资源,但资源我们一般都是读取,所以更好的选择是抑制copy行为,在copy时实施引用计数,当引用计数为0时,执行析构释放资源。总之就是使用std::shared_ptr管理对象。

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

这是为了适配需要访问原始资源的接口,所以智能指针提供了一个.get()接口返回其管理的裸指针。但需要明确的是,获取的裸指针只用来访问资源,不应对该指针执行delete,因为释放操作是授权给智能指针的。多次释放会导致非法释放内存错误。

16. 成对的使用new和delete时,要采用相同的形式

这个很简单,即构造一个对象,调用new构造,调用delete释放。构造对象数组,调用new Array[]构造,调用delete[] Array释放。

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

① 智能指针的构造函数是explicit的,即不会对输入参数进行隐式转换;

还是为了防止内存泄漏,以独立语句将newed对象置入智能指针,即std::shared_ptr<OneClass> p_oneclass(new OneClass(666))单独一行。因为如果这样使用int ret = Fun(std::shared_ptr<OneClass>(new OneClass(666)), other_func()), 编译器有可能将other_func()的执行放在new完对象和构造智能指针对象之间,如果此时other_func()抛出异常,那么指向资源的指针会丢失,造成内存泄漏。

小结:将你不知道该何时释放的对象放入智能指针管理。

《Effective C++》阅读总结(三):资源管理的更多相关文章

  1. 【原】FMDB源码阅读(三)

    [原]FMDB源码阅读(三) 本文转载请注明出处 —— polobymulberry-博客园 1. 前言 FMDB比较优秀的地方就在于对多线程的处理.所以这一篇主要是研究FMDB的多线程处理的实现.而 ...

  2. 【原】AFNetworking源码阅读(三)

    [原]AFNetworking源码阅读(三) 本文转载请注明出处 —— polobymulberry-博客园 1. 前言 上一篇的话,主要是讲了如何通过构建一个request来生成一个data tas ...

  3. 【原】SDWebImage源码阅读(三)

    [原]SDWebImage源码阅读(三) 本文转载请注明出处 —— polobymulberry-博客园 1.SDWebImageDownloader中的downloadImageWithURL 我们 ...

  4. Effective C++(第三版)笔记 ---- 第一部分让自己习惯C++

    内容从侯捷译版的<Effective C++>(第三版)摘录 条款一 C++作为一个多种范式融合的语言,可以看成是语言的联邦,它包含了一下四种主要的次语言: C.C++以C为基础,很多时候 ...

  5. 【详解】ThreadPoolExecutor源码阅读(三)

    系列目录 [详解]ThreadPoolExecutor源码阅读(一) [详解]ThreadPoolExecutor源码阅读(二) [详解]ThreadPoolExecutor源码阅读(三) 线程数量的 ...

  6. Redis源码阅读(三)集群-连接初始化

    Redis源码阅读(三)集群-连接建立 对于并发请求很高的生产环境,单个Redis满足不了性能要求,通常都会配置Redis集群来提高服务性能.3.0之后的Redis支持了集群模式. Redis官方提供 ...

  7. Effective C++ 笔记三 资源管理

    条款13:以对象管理资源 许多资源被动态分配于heap内而后被用于单一区块或函数内.它们应该在控制流离开那个区块或函数时被释放.标准程序库提供的auto_ptr正是针对这种形式而设计的特制产品.aut ...

  8. 《Effective C++》第三版笔记

    阅读此笔记前,请先阅读 <Effective C++>第二版笔记  和  <More Effective C++>笔记 这里只记录与上面笔记不同的条款,主要是 "面对 ...

  9. Effective Java 阅读笔记——方法

    38:检查参数的有效性 每当编写方法或者构造器的时候,应该考虑它的参数有哪些限制,在方法的开头处对参数进行检查,并且把这些限制写入文档. 注意: 对于公有方法,应该使用@throws标签在文档中说明违 ...

  10. SDWebImage源码阅读-第三篇

    这一篇讲讲不常用的一些方法. 1 sd_setImageWithPreviousCachedImageWithURL: placeholderImage: options: progress: com ...

随机推荐

  1. Graphics 与 DisplayObject 的关系

    在原生 Canvas 中,其实并没有 DisplayObject 的概念,它只有绘制图像的概念. 大部分的原生绘制图形或图像的 API 一般是这样的: api(x, y, ...) 例如 rect 就 ...

  2. 前端面试题整理——手写方法解析URL参数

    //拆分字符串形式 function queryToObj() { const res = {} const search = location.search.substr(1);//去掉前面的&qu ...

  3. Centos搭建 LAMP 服务器教程

    搭建 LAMP 服务 搭建 MySQL 数据库 安装 MySQL 使用 yum 安装 MySQL: yum install mysql-server -y 安装完成后,启动 MySQL 服务: ser ...

  4. vue单文件组件形成父子(子父)组件之间通信(vue父组件传递数据给子组件,子组件传递数据给父组件)

    看了很多文章,官网文档也有看,对父子组件通信说的不是很明白:决定自己总结一下: vue一般都使用构建工具构建项目:这样每个组件都是单文件组件:而网上很多文章都是script标签方式映入vue,组件通信 ...

  5. JdGrid排序问题

    JdGrid排序问题 js代码 function gridList() { var $gridList = $("#gridList"); $gridList.dataGrid({ ...

  6. Go xmas2020 学习笔记 07、Formatted & File I/O

    07-Formatted & File I/O. I/O steams. formatted I/O. fmt functions. file I/O. Practice ① I/O. Alw ...

  7. Python 速通爆肝、列表推导式、生成器、装饰器、生命游戏

    列表推导式.赋值.切片(替换.插入).字符串处理与判断.enumerate().格式化字符串.读写文件.global 关键字.字符串startswith().类与对象.生成器.装饰器.Self.*ar ...

  8. php进制转换

    前端html页面代码: <!DOCTYPE html> <html lang="en"> <head> <meta charset=&qu ...

  9. this的指向问题及改变this指向

    概念: this是运行环境下的一个系统变量, 由于this在不同的执行环境下有不同的值, 所以在使用this时,多加注意 (使用this之前,先打印) 1,在全局作用域下,this默认指向window ...

  10. 分布式应用运行时 Dapr 1.7 发布

    Dapr 是一个开源.可移植的.事件驱动的运行时,可以帮助开发人员构建在云和边缘上运行的弹性的.微服务的.无状态和有状态应用程序,并且关注于业务逻辑而不用考虑分布式相关的问题. 分布式相关的问题交给D ...