EC++学习笔记(三) 资源管理
条款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++学习笔记(三) 资源管理的更多相关文章
- Oracle学习笔记三 SQL命令
SQL简介 SQL 支持下列类别的命令: 1.数据定义语言(DDL) 2.数据操纵语言(DML) 3.事务控制语言(TCL) 4.数据控制语言(DCL)
- [Firefly引擎][学习笔记三][已完结]所需模块封装
原地址:http://www.9miao.com/question-15-54671.html 学习笔记一传送门学习笔记二传送门 学习笔记三导读: 笔记三主要就是各个模块的封装了,这里贴 ...
- JSP学习笔记(三):简单的Tomcat Web服务器
注意:每次对Tomcat配置文件进行修改后,必须重启Tomcat 在E盘的DATA文件夹中创建TomcatDemo文件夹,并将Tomcat安装路径下的webapps/ROOT中的WEB-INF文件夹复 ...
- java之jvm学习笔记三(Class文件检验器)
java之jvm学习笔记三(Class文件检验器) 前面的学习我们知道了class文件被类装载器所装载,但是在装载class文件之前或之后,class文件实际上还需要被校验,这就是今天的学习主题,cl ...
- VSTO学习笔记(三) 开发Office 2010 64位COM加载项
原文:VSTO学习笔记(三) 开发Office 2010 64位COM加载项 一.加载项简介 Office提供了多种用于扩展Office应用程序功能的模式,常见的有: 1.Office 自动化程序(A ...
- Java IO学习笔记三
Java IO学习笔记三 在整个IO包中,实际上就是分为字节流和字符流,但是除了这两个流之外,还存在了一组字节流-字符流的转换类. OutputStreamWriter:是Writer的子类,将输出的 ...
- NumPy学习笔记 三 股票价格
NumPy学习笔记 三 股票价格 <NumPy学习笔记>系列将记录学习NumPy过程中的动手笔记,前期的参考书是<Python数据分析基础教程 NumPy学习指南>第二版.&l ...
- Learning ROS for Robotics Programming Second Edition学习笔记(三) 补充 hector_slam
中文译著已经出版,详情请参考:http://blog.csdn.net/ZhangRelay/article/category/6506865 Learning ROS for Robotics Pr ...
- Learning ROS for Robotics Programming Second Edition学习笔记(三) indigo rplidar rviz slam
中文译著已经出版,详情请参考:http://blog.csdn.net/ZhangRelay/article/category/6506865 Learning ROS for Robotics Pr ...
随机推荐
- 目后佐道IT教育:师资团队
高端技术顾问 1. leepoor 拥有12年的Web开发和架构经验,在阿里巴巴担任高级架构师,参与阿里巴巴基础技术平台开发和www.alibaba.com架构设计.擅长大型网站技术架构,工作中经常使 ...
- 迅为iMX6Q/PLUS开发板烧写设备树内核 Qt 系统
迅为iMX6Q 和 iMX6PLUS 两个硬件版本,设备树镜像的烧写方法以及镜像所在目录,镜像名称全部一致. 如果用的是 iMX6Q 版本,想要烧写设备树版本镜像,请使用 iMX6Q 设备树版本的光盘 ...
- python 判断路径是否存在
import os os.path.exists(文件绝对路径)
- QT+常用控件_Line Edit
#include "mainwindow.h" #include "ui_mainwindow.h" #include <QDebug> #incl ...
- 当然,perl等脚本服务器是一般默认安装了,你入侵了一台主机,总不能先装配 Java 环境然后再开干吧?
转自:https://www.zhihu.com/question/20173592 当然,perl等脚本服务器是一般默认安装了,你入侵了一台主机,总不能先装配 Java 环境然后再开干吧?
- UISearchBar的应用
当你在seachBar中输入字母之前的时候,只是用鼠标选中searchBar的时候,如图 终端输出截图如下:(这个时候调用先shouldBeginEditing,之后调用didBeginEditing ...
- 1008: ASCII码
题目描述 相信大家一定都知道大名鼎鼎的ASCII码,这次给你的任务是输入数字(表示ASCII码),输出相对应的字符信息. 输入 第一行为一个整数T(1<=T<=1000).接下来包括T个正 ...
- LeetCode 岛屿的最大面积
给定一个包含了一些 0 和 1的非空二维数组 grid , 一个 岛屿 是由四个方向 (水平或垂直) 的 1 (代表土地) 构成的组合.你可以假设二维矩阵的四个边缘都被水包围着. 找到给定的二维数组中 ...
- css实现盒尺寸重置、均匀分布的子元素、截断文本
盒尺寸重置 重置盒子模型,以便width s和height s并没有受到border 还是padding他们的影响 . CSS文字折断 css实现盒尺寸重置.均匀分布的子元素.截断文本 如何对多行文本 ...
- (原)剑指offer跳台阶和矩形覆盖
跳台阶 时间限制:1秒空间限制:32768K 题目描述 一只青蛙一次可以跳上1级台阶,也可以跳上2级.求该青蛙跳上一个n级的台阶总共有多少种跳法. 分析同样为斐波那契数列边形这样的题肯定有公式 设 ...