《Effective C++》——条款17:以独立语句将newed对象置入智能指针
假设有如下两个函数:
int priority();
void processWidget(std::tr1::shared_ptr<Widget>pw, int priority);
对processWidget的调用如下:
processWidget(std::tr1::shared_ptr<Widget>pw(new Widget, priority());
编译器产出一个processWidget调用码之前,必须首先核算即将被传递的各个实参。上述第一实参由两部分组成:
- 执行"new Widget"表达式
- 调用tr1::shared_ptr构造函数
于是在调用processWidget之前,编译器必须创建代码,做以下三件事:
- 调用priority
- 执行"new Widget"
- 调用tr1::shared_ptr构造函数
C++编译器以什么样的次序完成这些事情弹性很大。可以确定的是"new Widget"一定执行于tr1::shared_ptr构造函数被调动之前。如果编译器选择第二顺位执行它,最终获得这样的操作序列:
- 执行“new Widget”
- 调用priority
- 调用tr1::shared_ptr构造函数
一旦对priority的调用导致异常,“new Widget”返回的指针将会遗失,从而导致内存泄露。
避免这类问题的办法是使用分离语句:分别写出(1)创建Widget,(2)将它置入一个智能指针内,然后再把那个智能指针传给processWidget(因为编译器对“跨越语句的各项操作”没有重新排列的自由):
std::tr1::shared_ptr<Widget>pw(new Widget);
processWidget(pw, priority());
《Effective C++》——条款17:以独立语句将newed对象置入智能指针的更多相关文章
- Effective C++ 条款17 以独立语句将newed对象置入智能指针
对于函数: int priority(); void processWidget(std::tr1:: shared_ptr<Widget> pw,int priority); 调用 ...
- Effective C++(17) 以独立语句将newed对象置入智能指针
问题聚焦: 使用了资源管理对象(如智能指针),就一定是安全的吗?显然不是. 资源泄露发生可能在于,在“资源被创建”和“资源被转换为资源管理对象”两个时间点之间有可能发生异常干扰. 看下 ...
- 条款17:以独立语句将newed对象置入智能指针(Store newed objects in smart pointers in standalone statements)
NOTE: 1.以独立语句将newed对象存储于智能指针内.如果不这样做,一旦异常被抛出,有可能导致难以察觉的资源泄漏.
- [Effective C++ --017]以独立语句将newed对象置入智能指针
这一节也比较简单,先假设我们有如下的函数: int foo(); void memFoo(shared_ptr<T> pw, int foo); 现在假设我们要调用memFoo函数: me ...
- Effective C++ -----条款17:以独立语句将newed对象置入智能指针
以独立语句将newed对象存储于(置入)智能指针内.如果不这样做,一旦异常被抛出,有可能导致难以察觉的资源泄露.
- 条款17:以独立语句将newed对象置入智能指针
请牢记: 以独立语句将newed对象存储于(置入)智能指针内.如果不这样做,一旦异常被跑出来,有可能导致难以察觉的资源泄露. 假设有个函数用来处理程序的优先权,另一个函数用来在某动态分配所得的Widg ...
- 【17】以独立语句将newed对象置入智能指针
1.为什么? 考虑下面的情况:方法声明为void processWidget(shared_ptr<Widget> pw,int priority). 调用方法 processWidget ...
- [EffectiveC++]item17:以独立语句将newed对象置入智能指针
Store newed objects in smart pointers in standalone statements
- 以独立的语句将new对象置入智能指针
以独立的语句将newed对象置入智能指针: processWidget(std::tr1::share_ptr<Widget>(new Widget) , priority()); 我们在 ...
随机推荐
- 什么是 XML Schema(转)
什么是 XML Schema? XML Schema 的作用是定义 XML 文档的合法构建模块,类似 DTD. XML Schema 的作用: 定义可出现在文档中的元素 定义可出现在文档中的属性 定义 ...
- 找出n的阶乘末尾有几个零
原理:因为10由2*5组成,而构成2的因数比5多 所以最终转换成求5的个数 int getNumber(int n) { int count = 0; while(n) { n = n/5; coun ...
- jqprint 打印网页 jQuery print plugin
ref://jQuery print plugin <!DOCTYPE html> <html lang="en"> <script src=&quo ...
- 20170411 F110初始界面-建议清单
功能块代码 F110 开发类 FIBP 事务说明 自动付款参数 程序 SAPF ...
- 【数学建模】MATLAB学习笔记——函数式文件
MATLAB学习笔记——函数式文件 引入函数式文件 说明: 函数式文件主要用于解决计算中的参数传递和函数调用的问题. 函数式的标志是它的第一行为function语句. 函数式文件可以有返回值,也可以没 ...
- 使用idea2016导出web项目war包
第一步配置Web Application:Exploded(已经配置的可以跳到第二步): 打开project structure(默认的快捷键是Ctrl+Alt+Shift+S),依次选择Artifa ...
- Java字段初始化规律:
Java字段初始化规律: Java进行初始化的地方有两个,初始化块和构造函数,其中初始化块又分为静态初始化块和实例初始化块(以上程序为实例初始化块).静态初始化块是类中由static修饰的初始化块,实 ...
- $UML统一建模语言简介
(一)UML概述 1.面向对象软件开发的过程: (1)OOA(面向对象分析):建立分析模型并文档化. (2)OOD(面向对象设计):用面向对象思想对OOA的结果进行细化,得出设计模型. (3)OOP( ...
- 【HackerRank】 Find Digits
Find Digits Problem Statement Given a number you have to print how many digits in that number exactl ...
- 树 List Leaves 【用数组模拟了树状结构建树+搜索叶子节点+按照特殊规律输出每个叶子节点】
Given a tree, you are supposed to list all the leaves in the order of top down, and left to right. I ...