常用的资源有:内存、文件描述器(file descriptor)、互斥锁(mutex locks)、图形界面中的字体和笔刷、数据库连接、以及网络sockets。这些资源一般动态创建和分配,也就是一个指针。不论哪一种资源,重要的是,当你不再使用时,必须将它还给系统。

条款13:以对象管理资源

  把资源放进对象里,我们便可以依赖C++的 析构函数 自动调用机制,确保资源被释放。对象在作用域结束时,其析构函数自动对其所指资源(对象)的指针调用delete。

  C++提供了2种用于管理资源的类,“智能指针” std::auto_ptr,和 “引用计数型智能指针”  std::tr1::shared_ptr。它们叫做智能指针,但本质是pointer-like对象,成员变量是表征资源的指针。二者使用方法一样:

 1 class Investment { ... };   
 2 Investment* createInvestment(); 
 3 
 4 void f()
 5 {
 6     ...
 7     std::tr1::shared_ptr<Investment> pInv1(createInvestment());       
 8                         // pInv1 points to the object returned from createInvestment
 9     std::tr1::shared_ptr<Investment> pInv2(pInv1);    
10                         // both pInv1 and pInv2 now point to the object
11                                  
12     pInv1 = pInv2;      //OK                    
13     ...
14 }

  auto_ptr不让多个auto_ptr同时指向同一个对象。如果真的那样,对象会被删除一次以上,而那会导致“未定义行为”。为了预防这个问题,auto_ptr有一个不寻常的性质: 若通过copy构造函数或copy assignment操作符复制它们,它们会变成null,而复制所得的指针将取得资源的唯一拥有权。还记得吗,STL容器要求其存储的元素具有正常的复制行为,因此这些容器容不得auto_ptr。

  shared_ptr具有正常的复制行为。可存储于STL容器。

  两者在析构函数内都对资源指针执行delete,而不是delete[]。所以动态分配的数组用它们管理是个馊主意。vector和string几乎总是可以取代动态分配得到的数组。

  两者有一个共同的名字,RAII对象。为防止资源泄露,请使用RAII对象。它们在构造函数中获得资源,并在析构函数中释放资源。通常,我们选择shared_ptr,因为其复制行为正常、直观。而auto_ptr复制动作会使他指向NULL。

  两外,tr1::shared_ptr 允许当智能指针被建立起来时制定一个资源释放函数(所谓删除器,"deleter")绑定于智能指针身上(auto_ptr 就没有这个能耐)。当引用次数为0时候,删除器 被调用。

  tr1::shared_ptr 支持定制型删除器。可以被用于自动解除互斥锁(mutexes, 见条款14)等等。

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

1 processWidget(std::tr1::shared_ptr<Widget>(new Widget), priority());   //非独立语句
2 std::tr1::shared_ptr<Widget> pw(new Widget);                  //独立语句
3 processWidget(pw, priority());

  1行中,编译器要执行三个操作。其中两个参数的计算次序编译器先做什么是有弹性的。如果如果priority函数在new之后执行,并且函数出现异常,新生成的Widget对象将未置入智能指针,资源产生泄漏。2、3行则解决了这个问题。

转载于:https://www.cnblogs.com/younes/archive/2010/03/08/1681074.html

Effective C++ 小笔记:条款13-17(第三章)相关推荐

  1. R语言学习笔记——入门篇:第三章-图形初阶

    R语言 R语言学习笔记--入门篇:第三章-图形初阶 文章目录 R语言 一.使用图形 1.1.基础绘图函数:plot( ) 1.2.图形控制函数:dev( ) 补充--直方图函数:hist( ) 补充- ...

  2. 【算法笔记题解】《算法笔记知识点记录》第三章——入门模拟1——简单模拟

    如果喜欢大家还希望给个收藏点赞呀0.0 相关知识点大家没基础的还是要看一下的,链接: <算法笔记知识点记录>第三章--入门模拟 由于放原题的话文章实在太长,所以题多的话我只放思路和题解,大 ...

  3. 【线性代数复习笔记】同济大学版第三章和第四章 矩阵的初等变换与线性方程组与向量组的线性相关性

    [线性代数复习笔记]同济大学版第三章和第四章 矩阵的初等变换与线性方程组与向量组的线性相关性 1.矩阵的初等变换 矩阵的三种初等变换及性质 行阶梯形矩阵 矩阵的初等变换的性质 2.矩阵的秩 矩阵的秩的 ...

  4. 机器人学中的状态估计学习笔记(二)第三章线性高斯系统的状态估计

    机器人学中的状态估计学习笔记(二)第三章线性高斯系统的状态估计 3.1 离散时间的批量估计问题 3.1.1 问题定义 3.1.2 最大后验估计 3.1.3 贝叶斯推断 3.1.4 存在性.唯一性与能观 ...

  5. 【C语言笔记初级篇】第三章:函数与递归

    第三章:函数 (1)函数是什么 在计算机科学中,子程序是一个大型程序中的某部分代码, 由一个或多个语句块组成.它负责完成某项特定任务,而且相较于其他代码,具备独立性.一般会有输入参数并有返回值,提供对 ...

  6. iPhone开发基础教程笔记(二)--第三章 处理基本交互

    第三章 处理基本交互 本章将编写一个稍微复杂的应用程序,他有两个按钮和一个标签.当用户按下任一按钮时,标签的文本将随之变化 3.1 模型-视图-控制器泛型 首先,让我们了解一些基本概念.Cocoa T ...

  7. 【Python学习笔记—保姆版】第三章—Python流程控制、函数的定义、常见错误、模块与包、类

    第三章-python函数.分支结构 流程控制 if-else for 循环 while循环 continue/break range()函数 列表与元组遍历 练习 函数的定义 变量作用域 基本形式 函 ...

  8. 【学习笔记】数据库系统原理 第三章 SQL语言

    以下内容为参考课件和<数据库系统概论>(第5版,王珊等著)的个人整理,若有错误欢迎指出 第三章 SQL语言 文章目录 第三章 SQL语言 一.概述 二.数据查询功能 1.查询语句 2.连接 ...

  9. Effective c++学习笔记条款20:宁以 pass-by-reference-to-const替换pass-by-value

    Prefer pass-by-reference-to-const to pass-by-value         这个问题在在C++是非常常见的.传值和传引用巨大的差别在于你所使用的参数是其本身还 ...

最新文章

  1. 基于wincc的虚拟电梯设计_基于WINCC的模拟电梯设计
  2. Python 中函数(function)的用法
  3. qt中文件读取的方法(新手入门必看)
  4. java 数组group by_java Group by分组算法
  5. 配置云服务器 FTP 服务
  6. jdk1.6 改 jdk1.7或jdk1.8(改回也可以)(图文详解)
  7. mysql5.6允许远程服务器访问数据库
  8. 蓝桥杯2016年第七届C/C++省赛B组第八题-四平方和
  9. viper4android fx2.7,ViPER4Android FX下载-ViPER4Android FX(蝰蛇音效fx)2.7.1.0 安卓版下载_东坡手机下载...
  10. Java10-I/O
  11. 3.3 测试实现标准的ZIO服务
  12. Docker——Dockerfile(构建自己的CentOS镜像和Tomcat镜像)并打包镜像发布上线
  13. 阿里云ECS安装MySql数据库
  14. Linux下AndroidNDK r7环境配置与NDK入门
  15. 获取客户端mac地址 php,js获取客户端mac地址的方法
  16. 2017年应届生落户上海流程简介
  17. 字符串匹配------回顾大一时的一份代码
  18. qml 分隔工具栏ToolSeparator 工具提示ToolTip 旋转轮Tumbler
  19. 自己定义ViewGroup实现仿淘宝的商品详情页
  20. 2-3-2 rsync+inotify备份同步数据

热门文章

  1. 【数字信号处理】序列傅里叶变换 ( 基本序列的傅里叶变换 | 求 a^nu(n) 的傅里叶变换 )
  2. 【开发环境】安装 Visual Studio Community 2013 版本 ( 安装软件 | 通过 GitHub 账号登录软件 | 启动软件 | 安装中文语言包 )
  3. 【Android 组件化】路由组件 ( 注解处理器参数选项设置 )
  4. 【Android 安装包优化】开启资源压缩 ( 资源压缩配置 | 启用严格模式的资源引用检查 | 自定义保留/移除资源配置 | 资源压缩效果 )
  5. 反射(操作MetaData)
  6. DOM中Event 对象如何使用
  7. iOS开发-登录界面开发(6)Toast-Swift的使用-Swfit4.1_Xcode9.3.1
  8. [高级软件工程教学]结队第1次作业成绩公布
  9. mybatis入门-第一个程序
  10. GsonBuilder