C.33: If a class has an owning pointer member, define a destructor

C.33:如果类包含拥有所有权的指针成员,定义析构函数Reason(原因)
An owned object must be deleted upon destruction of the object that owns it.从属对象必须通过拥有该对象的所有者类的析构函数销毁。

Example(示例)
A pointer member may represent a resource.A T* should not do so, but in older code, that's common. Consider a T* a possible owner and therefore suspect.指针成员可能用于表达某个资源。T*不应该这么做,但是在旧一些的代码中,这种做法很常见。考虑到T*作为所有者使用的可能性,并确认。

templateclass Smart_ptr {    T* p;   // BAD: vague about ownership of *p    // ...public:    // ... no user-defined default operations ...};void use(Smart_ptr p1){    // error: p2.p leaked (if not nullptr and not owned by some other code)    auto p2 = p1;}

Note that if you define a destructor, you must define or delete all default operations:注意:一旦定义了析构函数,就必须定义或者禁止所有的默认操作。

译者注:这里的默认操作指的是默认构造函数,拷贝/移动构造函数,拷贝/移动运算符和析构函数。

templateclass Smart_ptr2 {    T* p;   // BAD: vague about ownership of *p    // ...public:    // ... no user-defined copy operations ...    ~Smart_ptr2() { delete p; }  // p is an owner!};void use(Smart_ptr2 p1){    auto p2 = p1;   // error: double deletion}

The default copy operation will just copy the p1.p into p2.p leading to a double destruction of p1.p. Be explicit about ownership:默认拷贝操作只是将p1.p的值赋给p2.p(不包含其指向对象的拷贝),这会导致p1.p的双重析构。明确所有权:

templateclass Smart_ptr3 {    owner p;   // OK: explicit about ownership of *p    // ...public:    // ...    // ... copy and move operations ...    ~Smart_ptr3() { delete p; }};void use(Smart_ptr3 p1){    auto p2 = p1;   // OK: no double deletion}

译者注:实际上并不是改变p的类型为owner就可以解决问题的。注意这段代码通过注释实现了拷贝和移动操作,而前一段代码没有。

Note(注意)

Often the simplest way to get a destructor is to replace the pointer with a smart pointer (e.g., std::unique_ptr) and let the compiler arrange for proper destruction to be done implicitly.一般来说,得到析构函数最简单的方式是将指针换成智能指针(例如std::unique_ptr)并且让编译器提供适当的隐式执行的析构动作。

Note(注意)

Why not just require all owning pointers to be "smart pointers"? That would sometimes require non-trivial code changes and may affect ABIs.为什么不简单地要求所有的所有者指针都变成“智能指针”?因为那样做有时会引起重大的代码变更并且影响二进制接口。

Enforcement(实施建议)

  • A class with a pointer data member is suspect.带有指针类型数据成员的类都是可疑的。
  • A class with an owner should define its default operations.拥有owner成员的类应该定义默认操作。

译者注:owner的定义就是T,只是在源代码层次上增加了信息量,方便读者理解和工具检查。编译器看起来和之前的T没有任何区别,因此在二进制生成物层面上没有变化,这样就保证了既有代码可以安全地引入这种做法。

原文链接:

https://github.com/isocpp/CppCoreGuidelines/blob/master/CppCoreGuidelines.md#c33-if-a-class-has-an-owning-pointer-member-define-a-destructor


觉得本文有帮助?请分享给更多人。

更多文章请关注微信公众号【面向对象思考】!

面向对象开发,面向对象思考!

把类成员改成指针_如果类中存在管理其他类对象的指针,通过析构函数释放它们...相关推荐

  1. 把类成员改成指针_C++之this指针

    this指针概念说明 前面一篇文章说到成员变量和成员函数是分开存储的. 每一个非静态成员函数只会诞生一份函数实例,也就是说多个同类型的对象会共用一块代码. 那么问题是:这一块代码是如何区分是哪个对象调 ...

  2. IO流批量改文件名字,把文件夹中类似于文件名,“我java_爱好者_最帅“改成“爱好者_最轻特工组合“

    批量改文件名字,把文件夹中类似于文件名,"我java_爱好者_最帅"改成"爱好者_最轻特工组合" [思路] 最完整的思路 得到所有的文件对象(把所有要改名字的文 ...

  3. 将一个类改成线程_看了这个有趣的例子,相信你就秒懂多线程同步了

    电影票的案例 单线程的例子 我们设定有一个电影院,该电影院开张不久,在入口的旁边只设立了一个售票点A,顾客看电影,需要在售票点排队依次买票,买完票后在入口处检票进入电影院观影. 上面的描述用代码来实现 ...

  4. c ++ 函数的esp指针_在C ++中通过指针访问成员函数

    c ++ 函数的esp指针 Create a class along with data member and member functions and then access the member ...

  5. python英文版怎么改成中文版_“PyQt的Qt Designer菜单是中文版的,怎么改成英文的“python的qt designer教程...

    python qt designer 怎么多建一个dialog 请说的详细点,那原消?还是只是出外一个窗口,如果出现另外一个窗口,那么这个窗口是 exec()吗?就是弹出窗口不关闭无法点击原有窗口,即 ...

  6. endnote怎么改成中文版_毕业论文面对大量的参考文献标注,应该怎么办?(便捷整理的技巧和方法)...

    毕业论文不同于一般的小论文,特别是硕士毕业论文或者博士毕业论文.一般的小论文就四五页,而硕士论文动辄五六十页,有的甚至七八十页,因此有些东西如果要人工的去修改,将是一件非常痛苦的事情,比如目录自动生成 ...

  7. history 改成 模式_前端路由三种模式

    hash:任何情况下都可以做前端路由,缺点是SEO不友好(服务器收不到hash,浏览器是不会把#后面的内容发给服务器) history模式:后端将所有前端路由都渲染到同一个页面(不能是404页面),缺 ...

  8. postman如何改成中文版_在 Windows 上如何用 Postman 重现 Dubbo 反序列化漏洞

    Dubbo 2.7.5 以下的版本暴出了一个反序列化漏洞,那么如何在 windows 上重现这个漏洞呢? 1. 下载官方 demo 代码(暴出的漏洞是 http 协议的,故使用 http 的 demo ...

  9. java改成字体_更改JRE字体配置

    (1) JRE 1.4 的字体配置文件以及配置语法 关于 JRE1.4 的字体配置方法可参考 Sun 网站上的专门介绍: http://java.sun.com/j2se/1.4.2/docs/gui ...

最新文章

  1. @SupperssWarnings注解
  2. Web 服务器-Apache详解
  3. redis简单学习3-redis常用命令总结
  4. 信息学竞赛的常数优化、常见问题、代码风格相关
  5. 给csdn-blog开发组的建议(Kevins)
  6. Spring Boot集成Redis缓存之注解方式
  7. ansj 自定义 停用词_构造自定义停用词列表的快速提示
  8. ~~约数个数(附模板题)
  9. zabbix 调用api 批量删除主机
  10. 服务器(Windows系统)自建蚂蚁(leanote)笔记超详细步骤(包含数据备份和数据还原)
  11. 《程序设计基础课程设计》实验报告
  12. yylabel 加载html,YYLabel的富文本设置
  13. oracle设置自增序列,oracle设置自增字段,oracle序列
  14. 不同类型的Syslinux 引导
  15. SYNPROXY抵御DDoS攻击的原理和优化
  16. 台式电脑点关闭计算机关不了,台式电脑关机关不了怎么办
  17. 亚马逊AWS EC212个月免费计划及连接问题
  18. 微软客户体验中心感受
  19. 动作捕捉在各大领域的应用效果展示
  20. 联想手机吹响反攻号角,“诺曼底计划”未来要剑指何方?

热门文章

  1. VMware创建Linux及局域网内独立访问IP和访问外网IP的配置
  2. ios如何获取gps坐标(定位第二节)
  3. 让IT工作者过度劳累的12个坏习惯
  4. python判断是否为完全数_Python识别完美数
  5. 服务器centos怎么部署_我什么都不会,怎么拥有自己的个人博客呢
  6. ts语音自建服务器,自建TeamSpeak语音服务器,免费提供给专注游戏的玩家使用!...
  7. [转载] Java中的命名参数
  8. 判断五个分数等级划分_压力表精度等级怎么算?压力表精度等级划分及检验项目...
  9. css 轨道,html-当其他轨道增加时,CSS网格的轨道不会缩...
  10. qt没有mysql文件夹_qt5-qt目录下没有mysql文件夹