博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
条款17:以独立语句将newed对象置入智能指针
阅读量:4671 次
发布时间:2019-06-09

本文共 1078 字,大约阅读时间需要 3 分钟。

如果想要一个函数来获取程序的优先权(int priority()),另一个函数用来处理在某些动态分配所得到的资源进行优先权的处理(void processWidget(std::trl::shared_ptr<Widget> pw, int priority))
 
由于资源获取就是初始化,根据第13条款:,对动态分配来的Widget使用智能指针,这里用到了trl::shared_ptr
假设某处调用processWidget;
 
processWidget(new Widget,priority());
由于trl::shared_ptr的构造函数需要原始指针,而这个构造函数是explicit的,不允许进行隐式转换,这样写不能通过编译。
需要将new Widget转换成shared_ptr要求的形式。
processWidget(trl::shatrd_ptr<Widget> (new WIdget),priority());这样就可以通过编译。
 
编译器在调用processWidget时,需要提前核算出被传递的各个实参。
这样的话processWidget就需要做3件事:
1.调用priority;
2.执行“new Widget”;
3.调用trl::shared_prt构造函数。
C++并没有规定对实参进行特定顺序的核算(java有这种行为定义)。如果编译器能够以下面的顺序完成实参的核算最好不过:
1.执行“new Widget”;
2.调用priority;
3.调用trl::shared_ptr;
但是,万一对priority()调用异常,可能new返回的指针会遗失,此时它并未置入trl::shared_ptr内。这样的话,调用processWidget()时就会发生资源泄露。因为创建资源后并未能够转换为资源管理对象,这两个时间点之间可能发生了异常导致资源泄露。
 
如何避免呢?把实参语句分离出去。分别写出:
1. new Widget
2.将它置入一个智能指针内,然后把那个智能指针传给processWidget();
 
std::trl::shared_ptr<Widget> pw(new Widget);
processWigdet(pw,priority());//这样的话就不会造成资源泄露
 
记住:
    以独立语句将new得到的对象存储于智能指针内。如果不这样做,一旦异常被抛出,则有可能导致难以察觉的资源泄露。

 

转载于:https://www.cnblogs.com/Burgess-Fan/p/6783048.html

你可能感兴趣的文章
项目应用EasyUI_Tab控件全部关闭
查看>>
CTF之信息泄漏
查看>>
JavaScript作用域
查看>>
matlab 启动图标
查看>>
Transaction
查看>>
0001-Hello world(第一弹)
查看>>
瞎说一波3种基本背包问题【希望巨巨们指出错误】
查看>>
萌新笔记之交换排序
查看>>
[HEOI2016/TJOI2016]求和(第二类斯特林数)
查看>>
一道阿里面试题
查看>>
pta 习题集5-19 列车厢调度
查看>>
浅谈Ddos攻击攻击与防御
查看>>
HOJ 2148&POJ 2680(DP递推,加大数运算)
查看>>
HOJ 2156 &POJ 2978 Colored stones(线性动规)
查看>>
EL表达式学习笔记(JSTL)
查看>>
mybatis按datetime条件查询,参数为时间戳时
查看>>
常见软件开发模型
查看>>
改进方案1.0
查看>>
C#使用Monitor类、Lock和Mutex类进行多线程同步
查看>>
在O(1)时间删除链表结点
查看>>