I.11: 永远不要使用原始指针(T*)或引用(T&)来转移所有权

原因

如果对调用者或被调用者是否拥有对象有任何疑问,就会发生泄漏或过早析构。

示例

考虑:

 X* compute(args) // 不要这样做 { X* res = new X{}; // ... return res; }

谁来删除返回的X?当compute返回一个引用时,则更难发现问题。考虑按值返回结果(如果结果很大,使用move语义):

 vector compute(args) // good { vector res(10000); // ... return res; }

可选方法: 传递所有权 使用"智能指针",如unique_ptr(独占所有权)和shared_ptr(共享所有权),然而,这并不会比返回对象本身更优雅和高效,所以只有在需要引用语义时才使用智能指针。

可选方法: 有时,由于ABI的兼容性要求和资源缺失,导致更旧代码无法修改,在这种情况下,使用指南支持库中的owner标记拥有指针:

 owner compute(args) // 现在很清楚,所有权已经转移 { owner res = new X{}; // ... return res; }

这告诉分析工具res是所有者,也就是说,它的值必须被delete或转移到另一个所有者,就像这里的return所做的那样。owner在资源句柄的实现中有也类似应用。

Note

作为原始指针(或迭代器)传递的每个对象都假定为调用者所拥有,因此它的生命周期由调用者处理。从另一个角度来看:与指针传递API相比,所有权转移API相对较少,因此默认为“无所有权转移”。

另请参阅: 参数传递、 智能指针参数的使用 和 按值返回.

实施

  • (简单) 警告delete非owner的原始指针,建议使用标准库资源句柄或使用owner。
  • (简单) 每条代码路径上reset或显式delete一个owner指针时,警告失败。
  • (简单) 如果new的返回值或带owner返回值的函数调用被分配给原始指针或非owner引用,则发出警告。

c++ 返回智能指针_C++核心指南(17) I.11 禁止使用指针(T*)或引用(T)来转移所有权...相关推荐

  1. c++ file* 句柄泄漏_C++核心指南:P.8 勿泄漏任务资源

    P.8: 勿泄漏任务资源 原因 随着时间的推移,即使是资源的缓慢增长也会耗尽这些资源的可用性,这对于长时间运行的程序特别重要,但也是负责任的编程行为的基本部分. 糟糕的例子 void f(char* ...

  2. const 指针_C语言学习日记(11)——const与指针

    对于一个普通指针typet *p.p有三个最基本的能力,第一就是可以通过p = &obj来指向一个type类型对象,并随意切换指向对象.第二就是通过value = *p来读取它指向的对象的值. ...

  3. this指针_c++11新特性之智能指针

    很多人谈到c++,说它特别难,可能有一部分就是因为c++的内存管理吧,不像java那样有虚拟机动态的管理内存,在程序运行过程中可能就会出现内存泄漏,然而这种问题其实都可以通过c++11引入的智能指针来 ...

  4. 返回指针_C语言面试中的问题指针和引用的使用场景?

    先解决两个疑问: ◆ 指针和引用的不同之处是什么? ◆ 何时用用指针?何时用引用? 01  指针和引用的不同之处 看如下代码: 指针是用来表示内存地址的,而指针这个整数正是被指向的变量地址. 而引用就 ...

  5. 我的百度研发面经整合版(智能云,核心搜索) | 掘金技术征文

    百度研发面经 百度智能云 软件研发工程师 百度今年的提前批有点奇怪,好像都不走流程,牛客上好几个百度内推的帖子,我投了几个,基本上都是百度智能云的. 然后这些部门都安排了面试,没有冲突,所以没有动静的 ...

  6. 智能网联建设核心评价指标探讨

    智能网联建设取得一定进展,工信部.公安部.交通运输部在全国各地先后支持建设16个国家级智能网联汽车测试示范区,另外还有几十个城市和众多高速高速公路在开展智能网联试点示范工作.当然,智能网联建设依然面临 ...

  7. 智能风控平台核心之风控决策引擎(四)

    智能风控平台核心之风控决策引擎(四) 本文摘要:风控报告.模型监控.接口管理 本文适合阅读人群:金融产品.策略模型.研发 停更大半年我没有跑,只是在专注地筹备接下来的更多优质内容,在此给长期支持的朋友 ...

  8. 开发指南:BUMO 智能合约 Java 开发指南

    BUMO 智能合约 Java 开发指南 概述 合约是一段JavaScript代码,标准(ECMAScript as specified in ECMA-262).合约的初始化函数是init, 执行的入 ...

  9. 你知道吗?智能的最核心是什么?道翰天琼认知智能机器人平台API接口大脑为您揭秘。

    你知道吗?智能的最核心是什么?道翰天琼认知智能机器人平台API接口大脑为您揭秘. 2020 年8 月7日-8月9日,在中国深圳,由中国计算机学会(CCF)主办,香港中文大学(深圳).雷锋网联合承办,鹏 ...

最新文章

  1. 加强数据中心安全的六条措施
  2. Anychat的绝对路径与相对路径
  3. 中国顶级互联网公司的技术组织架构调整预示着什么?【强烈推荐行业人士阅读】
  4. 欢乐纪中A组赛【2019.8.17】
  5. html标记的索引,基于HTML标记分析及中文切词的网页索引研究与实现
  6. 上手Caffe(一)
  7. PHP案例:实现数据库增删改查功能
  8. 重磅分享--基于违约概率跟odds的经验评分
  9. linux中ONBOOT=yes
  10. java 舆情分析_基于Java实现网络舆情分析系统研究与实现.doc
  11. EXCEL2007导入SQL生成新表并插入数据
  12. 2021高考成绩查询数学和物理,2021高考成绩什么时候几点可以查
  13. PS抠发丝技巧 「选择并遮住…」
  14. python数据分析设置教程视频_炼数成金女讲师Python数据分析实战应用视频教程
  15. Kettle连接MySQL数据库报错:Driver class ‘org.gjt.mm.mysql.Driver‘ could not be found
  16. Android计步模块(类似微信运动)
  17. html制作网易云音乐登录系统,JavaScript实现[网易云音乐Web站登录窗口]拖拽功能...
  18. 高级防火墙规则-Direct Rules
  19. 戴仁光:神奇的推广力量——软文
  20. springboot+社区快递代取服务系统毕业设计-附源码051434

热门文章

  1. 电脑怎么重置host_电脑又双叒叕卡顿?究竟要“重装”还是“重置”?原来这区别大了...
  2. Git使用手册--超级详细,自己都看哭了
  3. android 知识点大全,Android基础知识总结(一)
  4. 没有bug队——加贝——Python 练习实例 21,22
  5. 用html编写一幅简单的画,使用html5画简单的折线图
  6. mysql未找到bcrypt_使用mysql和bcryptjs时出现意外的标识符语法错误
  7. pcl的初步使用(ROS)
  8. arm9 中断向量 重定位_关于STM32中断向量表的位置 、重定向问题
  9. 2018年下半年《软件评测师》下午试卷及答案
  10. 在Mysql中count(*)、count(1)与count(字段/列名)的详解—聚合函数count