条款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. WPF中HyperLink超链接的使用

    HyperLink超链接的简单使用:  XAML里面: <TextBlock> <Hyperlink NavigateUri="http://www.baidu.com&q ...

  2. python_110_反射

    class Dog(object): def __init__(self,name): self.name=name def eat(self): print('%s is eating '%self ...

  3. springmvc导出excel(POI)

    /** * 导出excel表格 */ @RequestMapping(value = "/doExportData", method = {RequestMethod.POST, ...

  4. java在线聊天项目1.2版 ——开启多个客户端,分别实现数据库注册和登录功能后,成功登陆则登录框消失,好友列表窗出现

    登录框消失语句 dispose(); 好友列表窗出现 使用new FriendsFrame(phone,s); 登陆对话框代码修改如下: package com.swift.frame; import ...

  5. HDU - 4811 - Ball (思维)

    题意: 给出一定数量的三种颜色的球,计算如何摆放得到值最大(有一定顺序) 有三种摆放方法 1.如果放的是第一个(桌子上原来没有),数值不变 2.如果在末尾追加一个,那么增加前面不同颜色的个数的值 3. ...

  6. Hdu 3177 (贪心)

    题目大意: 山洞的体积为\(v\) 第\(i\)个物品放在山洞里会占据\(a_i\)的空间,在搬运过程中至少需要\(b_i\)的空间 问能不能把所有物品都放下 贪心题.比较难看出贪心,但是从无顺序要求 ...

  7. PAT 乙级 1012

    题目 题目地址:PAT 乙级 1012 思路 最后一个测试点怎么也过不了,问题在于A2的判断,不能单纯地以0作为判断条件:假设满足A2条件的只有两个数6和6,计算结果仍然是0,但是输出A2的值是0不是 ...

  8. Spring核心技术(十二)——基于Java的容器配置(二)

    使用@Configuration注解 @Configuration注解是一个类级别的注解,表明该对象是用来指定Bean的定义的.@Configuration注解的类通过@Bean注解的方法来声明Bea ...

  9. [WPF自定义控件库]使用WindowChrome的问题

    1. 前言 上一篇文章介绍了使用WindowChrome自定义Window,实际使用下来总有各种各样的问题,这些问题大部分都不影响使用,可能正是因为不影响使用所以一直没得到修复(也有可能别人根本不觉得 ...

  10. go 本地安装 grpc-go

    https://blog.csdn.net/code_segment/article/details/77461590 https://github.com/grpc/grpc-go git clon ...