条款13:以对象管理资源

资源包括:动态分配内存、文件描述符、网络socket、互斥锁、数据库连接

把资源放进对象内,可以依赖c++的"析构函数自动调用机制"确保资源被释放
智能指针: 是一个"类指针"对象,引用计数型指针,当引用对象数为0时,自动删除该资源

std::shared_ptr<Class> pClass(new Class);

每一笔资源都在获得的同时立刻被放进管理对象中

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

RAII:资源获取即初始化,资源在构造函数期间获得,析构函数期间释放

class Lock {
public:
explicit Lock(Mutex* pm) : mutexPtr(pm) {
lock(mutexPtr);
} ~Lock() {
unlock(mutexPtr);
}
private:
Mutex* mutexPtr;
};

当一个RAII对象被复制时:
a.禁止复制:将copy函数声明为 private 且只声明不实现
b.引用计数:std::shared_ptr
shared_ptr 允许指定所谓的"删除器"(一个函数或函数对象),当引用计数为0时便被自动调用

class Lock{
public:
explicit Lock(Mutex* pm)
: mutexPtr(pm, unlock) { lock(mutexPtr.get()); }
private:
std::shared_ptr<Mutex> mutexPtr;
};

c.复制底部资源,深度拷贝
d.慎用:auto_ptr,转移底部资源的拥有权,资源的拥有权会从被复制对象转移到目标对象

条款15:在资源管理类中提供对原始资源的访问
std::shared_ptr<Class> pClass(new Class);

现在某个函数要求访问原始资源:
int func(const Class *pClass);
如果我们调用:int result = func(pClass);
此时错误,因为func函数需要的是 Class* 指针(原始指针),而不是std::shared_ptr<Class>

shared_ptr提供一个get成员函数,用来执行显式转换,会返回智能指针内部的原始指针(的拷贝)

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

如果 delete 加上中括号,delete 便认定指针指向一个数组,否则认定指针指向单一对象

string* stringPtr1 = new string;
string* stringPtr2 = new string[]; delete stringPtr1; //删除单一对象
delete []stringPtr2; //删除由对象组成的数组
条款17:以独立语句将newed对象置入智能指针
int func(std::shared_ptr<Widget> (new Widget), func1());

在调用func之前,编译器必须创建代码,做一下三件事:
1.调用func1()
2.执行 new Widget
3.调用shared_ptr的构造函数
c++编译器并未指定这3件事的执行次序

如果编译器按 2--->1--->3 的次序执行
当执行func1出现异常时, new Widget返回的指针并未成功置入 shared_ptr内,可能引发资源泄露

解决方法:以单独语句将newed对象置入智能指针内

std::shared_ptr<Widget> pw(new Widget);
func(pw, func1());

EC++学习笔记(三) 资源管理的更多相关文章

  1. Oracle学习笔记三 SQL命令

    SQL简介 SQL 支持下列类别的命令: 1.数据定义语言(DDL) 2.数据操纵语言(DML) 3.事务控制语言(TCL) 4.数据控制语言(DCL)  

  2. [Firefly引擎][学习笔记三][已完结]所需模块封装

    原地址:http://www.9miao.com/question-15-54671.html 学习笔记一传送门学习笔记二传送门 学习笔记三导读:        笔记三主要就是各个模块的封装了,这里贴 ...

  3. JSP学习笔记(三):简单的Tomcat Web服务器

    注意:每次对Tomcat配置文件进行修改后,必须重启Tomcat 在E盘的DATA文件夹中创建TomcatDemo文件夹,并将Tomcat安装路径下的webapps/ROOT中的WEB-INF文件夹复 ...

  4. java之jvm学习笔记三(Class文件检验器)

    java之jvm学习笔记三(Class文件检验器) 前面的学习我们知道了class文件被类装载器所装载,但是在装载class文件之前或之后,class文件实际上还需要被校验,这就是今天的学习主题,cl ...

  5. VSTO学习笔记(三) 开发Office 2010 64位COM加载项

    原文:VSTO学习笔记(三) 开发Office 2010 64位COM加载项 一.加载项简介 Office提供了多种用于扩展Office应用程序功能的模式,常见的有: 1.Office 自动化程序(A ...

  6. Java IO学习笔记三

    Java IO学习笔记三 在整个IO包中,实际上就是分为字节流和字符流,但是除了这两个流之外,还存在了一组字节流-字符流的转换类. OutputStreamWriter:是Writer的子类,将输出的 ...

  7. NumPy学习笔记 三 股票价格

    NumPy学习笔记 三 股票价格 <NumPy学习笔记>系列将记录学习NumPy过程中的动手笔记,前期的参考书是<Python数据分析基础教程 NumPy学习指南>第二版.&l ...

  8. Learning ROS for Robotics Programming Second Edition学习笔记(三) 补充 hector_slam

    中文译著已经出版,详情请参考:http://blog.csdn.net/ZhangRelay/article/category/6506865 Learning ROS for Robotics Pr ...

  9. Learning ROS for Robotics Programming Second Edition学习笔记(三) indigo rplidar rviz slam

    中文译著已经出版,详情请参考:http://blog.csdn.net/ZhangRelay/article/category/6506865 Learning ROS for Robotics Pr ...

随机推荐

  1. confluent 更换ip地址之后修改数据库

    由于地址搬迁导致ip地址有变动,整个的confluence的服务器的ip的地址更换和对应的数据库地址更换 root@computer-PowerEdge-T30:/opt/atlassian/conf ...

  2. (转)MyBatis框架的学习(四)——Mapper.xml文件中的输入和输出映射以及动态sql

    http://blog.csdn.net/yerenyuan_pku/article/details/71893689 前面对MyBatis框架的学习中,我们对Mapper.xml映射文件多少有些了解 ...

  3. Android(java)学习笔记148:网易新闻RSS客户端应用编写逻辑过程

    1.我们的项目需求是编写一个新闻RSS浏览器,RSS(Really Simple Syndication)是一种描述和同步网站内容的格式,是使用最广泛的XML应用.RSS目前广泛用于网上新闻频道,bl ...

  4. 第009课 gcc和arm-linux-gcc和MakeFile

    from:第009课 gcc和arm-linux-gcc和MakeFile 第001节_gcc编译器1_gcc常用选项_gcc编译过程详解 gcc的使用方法 gcc [选项] 文件名 gcc常用选项 ...

  5. PAT (Basic Level) Practise (中文)-1037. 在霍格沃茨找零钱(20)

    PAT (Basic Level) Practise (中文)-1037. 在霍格沃茨找零钱(20) http://www.patest.cn/contests/pat-b-practise/1037 ...

  6. 寄存器变量 extern 外部变量 外部函数

    寄存器变量 这个可以不理睬 register 关键字定义的变量直接放在寄存器当中 寄存器是放在CPU内部的存储单元,它的速度比内存快的多,所以当程序中有10000多次调用同一个变量的时候声明成寄存器变 ...

  7. html中footer如何一直保持在页底

    最近在开发博客过程中,遇到有些body的height是比window的height要低的,然后就出现了footer在页面中间的尴尬样子.那么这种情况怎么解决呢: 首先,写一个footer标签: < ...

  8. Python中读取txt文本出现:SyntaxError: (unicode error) 'unicodeescape' codec can't decode bytes in position 2-3: truncated \UXXXXXXXX escape问题解决

    windows中的路径是反斜杠\,然而反斜杠\在python中有着转义字符的意义,所以在py文件中写windows文件路径的时候,要特别注意反斜杠\的使用. 下面有三种解决方式: 方式一:转义的方式 ...

  9. (7)zabbix资产清单inventory管理

    概述 监控的设备越来越多,有时候搞不清楚哪台服务器是什么配置,大多公司有自己的资产清单,要去专门的系统查询显得多少有点麻烦.为此,zabbix专门设置了设备资产管理功能. 我们创建或编辑主机的时候,可 ...

  10. Python基础:字典(dict)与集合(set)

    查找场景下与列表的性能对比 字典与集合之所以高效的原因是:内部结构都是一张哈希表. 平均情况下插入.查找和删除的时间复杂度为 O(1). 假设有数量100,000的产品列表: import time ...