以独立语句将newed对象置于只能指针

思考以下情形:

int priority();
void processWidget(std::shared_ptr<Widget> pw, int priority);

如果调用方式如下:

processWidget(new Widget, priority());

将会编译失败。因为processWidget需要一个std::shared_ptr对象,传入的却是Widget指针。而std::share_ptr的单参数构造函数被设置为explicit。所以不能由Widget隐式转换成std::shared_ptr。

可以使用如下调用通过编译。

processWidget(std::shared_ptr<Widget>(new Widget), priority());

但是仍存在以下问题:
编译器对其参数的处理分为3部分:
1 执行priority()
2 执行new Widget
3 执行std::shared_ptr的构造函数

C++语法所致,编译器执行1 2 3的顺序不定,只要满足2在3前执行即可。
如果执行顺序是 2 1 3,而执行1时发生异常,Widget*即会出现内存泄漏。

避免出现这种情况,很简单,只需要2 3顺序执行不可分割即可,如下所示:

std::shared_ptr<Widget> pw(new Widget);
processWidget(pw, priority());

请记住:

  • 以独立语句将newed对象存储于(置入)智能指针内。如果不这样做,一旦异常被抛出,有可能导致难以察觉的资源泄漏。

17. Store newed objects in smart pointers in standalone statements相关推荐

  1. Smart Pointers(智能指针)与Epoch-Based Reclamation (EBR)详细介绍和对比

    Smart Pointers 它基于三个概念,包括堆栈分配的指向堆分配内存的指针,扮演每个对象的垃圾收集角色和 RAII. 有 3 个 API:unique_ptr.shared_ptr 和 weak ...

  2. Reference Counted Smart Pointers

    http://www.goingware.com/tips/parameters/refcount.html

  3. [EffectiveC++]item17:以独立语句将newed对象置入智能指针

    Store newed objects in smart pointers in standalone statements 转载于:https://www.cnblogs.com/jeanschen ...

  4. Effective C++ 改善55个方法

    美·Scott Meyers 候捷 电子工业 2011 刚才看到个会议时间有点晚,3.25论文都提交了 谷歌去广告的插件, 最后投了这个会议,刚刚好正合适.我说金钱与时间 ACCUSTOMING YO ...

  5. Effective C++改善程序与设计的55个具体做法笔记

    Scott Meyers大师Effective三部曲:Effective C++.More Effective C++.Effective STL,这三本书出版已很多年,后来又出版了Effective ...

  6. Effect C++ 学习笔记三:资源管理

    资源:内存,文件描述器,互斥锁,图形界面的字体和笔刷,数据库链接,socket等. 十三:Use objects to manage resources. 以对象管理资源 class Investme ...

  7. 《Effective C++》》阅读笔记

    第一章    Accustoming Yourself to C++ 1           View C++ as a federation of language (1).             ...

  8. Effective C++读书笔记 摘自 pandawuwyj的专栏

    Effective C++读书笔记(0)       Start   声明式(Declaration):告诉编译器某个东西的名称和类型,但略去细节.   std::size_t numDigits(i ...

  9. STL--Function Objects(一)

    2019独角兽企业重金招聘Python工程师标准>>> The Concept of Function Objects A function object, or functor, ...

  10. C++并发编程(C++11到C++17)转载

    C++并发编程(C++11到C++17)转载 作者:paulquei https://paul.pub/cpp-concurrency/ 为什么要并发编程 大型的软件项目常常包含非常多的任务需要处理. ...

最新文章

  1. 兰大本科生发31篇论文遭质疑,本人及校方回应!
  2. poj 1379 模拟退火法
  3. Exchange2007 申请安装证书
  4. java操作Excel的poi 遍历一个工作簿
  5. LeetCode 791. 自定义字符串排序(map)
  6. 删除服务中的mysql服务
  7. java中list方法addall怎么写_简历中个人优势怎么写?| 四大方法教你打造独一无二“个人标签”...
  8. java的super_Java中的Super()
  9. 有计算机科学与技术专业的大学,开设计算机科学与技术专业的大学有哪些,开设计算机科学与技术专业的大学有哪些...
  10. 生活随笔: 毕业之前和毕业之后
  11. docker容器和宿主机时间不一致的问题
  12. mysql数据库的安装和配置文件_Mysql数据库介绍、安装和配置文件
  13. 【代码规范】阿里巴巴代码规范
  14. python不定积分教学_python使用sympy不定积分入门及求解
  15. 如何高效设计游戏——游戏伤害公式的量身定做
  16. 全面解读系统更新,收藏下这份 Android 12 (S) 版本适配自查表
  17. 顺丰菜鸟大战 本质是以数据获得企业竞争壁垒
  18. opnet学习001,入门的好例子
  19. Linux USB摄像头使用
  20. javaweb毕业设计源码 基于ssm农产品供销服务系统

热门文章

  1. 再论sklearn分类器
  2. 15K薪资轻松到手,要低调~
  3. C#ToString() 格式化数值
  4. 对Oracle SQL Developer中 变量的学习
  5. 远程桌面控制VC源码剖析
  6. 22. linux 日志分析
  7. 15.explain
  8. 83. 验证码(1)
  9. 4. laravel 路由(1)
  10. php中global与$_GLOBALS[]的区别