《Effective C++》资源管理:条款13-条款17
条款13:以对象管理资源
- 为了防止资源泄漏,请使用RAII(Resource Acquisition Is Initialization)对象,在构造函数里面获得资源,在析构函数里面释放资源
- auto_ptr,shared_ptr,unique_lock都是RAII类。
- 一个对象只能由单一auto_ptr指向,不可让多个auto_ptr同时指向同一对象。
- 通过copy构造函数或者copy assignment操作符赋值auto_ptr,被复制的auto_ptr会变成null,复制所得的auto_ptr会获得资源的唯一使用权。
- STL容器不得使用auto_ptr作为模板类型。
条款14:在资源管理类中小心coping行为
- 常见的RAII对象copy行为
- 禁止copy
- 引用计数
- 深度复制
- 转移资源拥有权
条款15:在资源管理类中提供对原始资源的访问
- APIs 往往要求访问原始资源,所以RAII class 应该提供一个获取其所管理资源的接口(如shared_ptr的get()函数)。
- 可通过显示和隐式接口对原始资源的访问,显示比较安全,隐式方便客户。
//隐式转换
class raiiclass {
public:
...
operate raiiclass() const {return res;}
...
private:
rawres res;
}
条款16:成对使用new和delete时要采取相同形式
- new中使用[],必须在相应的delete中使用[]
- nem中未使用[],delete中也不可以使用[]
条款17:以独立语句将newed对象置入智能指针
以独立语句将newed对象存储于智能指针内,防止“资源被创建(new过程)”和“资源被转化为管理对象”两个时间点可能发生异常干扰。
process(new Widget, priority);
//独立语句将newd对象存入智能指针
shard_ptr<Widget> p(new Widget);
process(p, priority);
《Effective C++》资源管理:条款13-条款17的更多相关文章
- 《Effective C++》学习笔记条款13 以对象管理资源
条款 13 :以对象管理资源 例: voidf() { Investment *pInv = createInvestment(); ... ...
- EC读书笔记系列之8:条款13、14、15
条款13 以对象管理资源 记住: ★为防止资源泄漏,请使用RAII对象,它们在构造函数中获得资源并在析构函数中释放 ★两个常被使用的RAII classes分别是tr1::shared_ptr和aut ...
- Effective C++_笔记_条款01_视C++为一个语言联邦
(整理自Effctive C++,转载请注明.整理者:华科小涛@http://www.cnblogs.com/hust-ghtao/) C++的各种能力和特性使它成为一个无可匹敌的工具,但也可能引发某 ...
- Effective Modern C++翻译(5)-条款4:了解如何观察推导出的类型
条款4:了解如何观察推导出的类型 那些想要知道编译器推导出的类型的人通常分为两种,第一种是实用主义者,他们的动力通常来自于软件产生的问题(例如他们还在调试解决中),他们利用编译器进行寻找,并相信这个能 ...
- 《Effective Modern C++》翻译--条款4:了解怎样查看推导出的类型
条款4:了解怎样查看推导出的类型 那些想要了解编译器怎样推导出的类型的人通常分为两个阵营. 第一种阵营是实用主义者.他们的动力通常来自于编敲代码过程中(比如他们还在调试解决中),他们利用编译器进行寻找 ...
- More Effective C++ 基础议题(条款1-4)总结
More Effective C++ 基础议题(条款1-4)总结 条款1:仔细区别pointers和references 如果有一个变量,其目的是用来指向(代表)另一个对象,但是也有可能它不指向(代表 ...
- 《Effective C++ 》学习笔记——条款11
***************************************转载请注明出处:http://blog.csdn.net/lttree************************** ...
- Effective C++ ——资源管理
条款13:以对象来管理资源 在C++中我们经常会涉及到资源的申请与申请,一般都是由关键字new 和 delete来操作的,两者都是成对存在的,缺一不可,否则会出现意想不到的问题,例如: class I ...
- Effective C++ —— 资源管理(三)
条款13 : 以对象管理资源 假设有如下代码: Investment* createInvestment(); //返回指针,指向Investment继承体系内的动态分配对象,调用者有责任删除它 vo ...
随机推荐
- 不同主机的docker容器互相通信
Docker启动时,会在宿主主机上创建一个名为docker0的虚拟网络接口,默认选择172.17.0.1/16,一个16位的子网掩码给容器提供了 65534个IP地址. docker0只是一个在绑定到 ...
- MySQL高级知识系列目录
MySQL高级知识(一)——基础 MySQL高级知识(二)——Join查询 MySQL高级知识(三)——索引 MySQL高级知识(四)——Explain MySQL高级知识(五)——索引分析 MySQ ...
- 第二十六篇:USB3.0高带宽ISO(48KBytes/125us)实战
USB3.1技术已经推出, 10Gbps的速率足以满足数据, HD视频传输的要求. 要步入USB3.1的研发, 还得将USB3.0的基础打扎实. 微软提供的SUPER MUTT仅仅包括一个接口0, 其 ...
- 分布式锁(一) Zookeeper分布式锁
什么是Zookeeper? Zookeeper(业界简称zk)是一种提供配置管理.分布式协同以及命名的中心化服务,这些提供的功能都是分布式系统中非常底层且必不可少的基本功能,但是如果自己实现这些功能而 ...
- Request Body可以反复读取的方法
org.springframework.web.filter.HiddenHttpMethodFilter:过滤器已经读取流了,因此想频繁读取流的话,自定义Filter必须在org.springfra ...
- conda install 出错
在下载包时出现下面的错误: userdeMBP:pytorch user$ conda install -n deeplearning matplotlib Solving environment: ...
- appium+python自动化56-微信小程序自动化(摩拜为例)
前言 最近微信的小程序越来越多了,随之带来的问题是:小程序如何做自动化测试? 本篇以摩拜小程序为例,介绍如何定位小程序里面的元素 运行环境: android 7.0 appium v1.7.1 web ...
- face detection[S^3FD]
本文来自<\(S^3\)FD: Single Shot Scale-invariant Face Detector>,时间线为2017年11月. 0 引言 基于锚的目标检测方法,是通过分类 ...
- Vue-computed的set和get
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- 如何在同一台电脑上启动多个Tomcat服务器
安装第二个tomcat完成后,到安装目录下的conf子目录中打开server.xml文件,查找以下三处: (1)修改http范围端口(默认为8080端口) <Connector port=&qu ...