把类成员改成指针_如果类中存在管理其他类对象的指针,通过析构函数释放它们...
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
觉得本文有帮助?请分享给更多人。
更多文章请关注微信公众号【面向对象思考】!
面向对象开发,面向对象思考!
把类成员改成指针_如果类中存在管理其他类对象的指针,通过析构函数释放它们...相关推荐
- 把类成员改成指针_C++之this指针
this指针概念说明 前面一篇文章说到成员变量和成员函数是分开存储的. 每一个非静态成员函数只会诞生一份函数实例,也就是说多个同类型的对象会共用一块代码. 那么问题是:这一块代码是如何区分是哪个对象调 ...
- IO流批量改文件名字,把文件夹中类似于文件名,“我java_爱好者_最帅“改成“爱好者_最轻特工组合“
批量改文件名字,把文件夹中类似于文件名,"我java_爱好者_最帅"改成"爱好者_最轻特工组合" [思路] 最完整的思路 得到所有的文件对象(把所有要改名字的文 ...
- 将一个类改成线程_看了这个有趣的例子,相信你就秒懂多线程同步了
电影票的案例 单线程的例子 我们设定有一个电影院,该电影院开张不久,在入口的旁边只设立了一个售票点A,顾客看电影,需要在售票点排队依次买票,买完票后在入口处检票进入电影院观影. 上面的描述用代码来实现 ...
- c ++ 函数的esp指针_在C ++中通过指针访问成员函数
c ++ 函数的esp指针 Create a class along with data member and member functions and then access the member ...
- python英文版怎么改成中文版_“PyQt的Qt Designer菜单是中文版的,怎么改成英文的“python的qt designer教程...
python qt designer 怎么多建一个dialog 请说的详细点,那原消?还是只是出外一个窗口,如果出现另外一个窗口,那么这个窗口是 exec()吗?就是弹出窗口不关闭无法点击原有窗口,即 ...
- endnote怎么改成中文版_毕业论文面对大量的参考文献标注,应该怎么办?(便捷整理的技巧和方法)...
毕业论文不同于一般的小论文,特别是硕士毕业论文或者博士毕业论文.一般的小论文就四五页,而硕士论文动辄五六十页,有的甚至七八十页,因此有些东西如果要人工的去修改,将是一件非常痛苦的事情,比如目录自动生成 ...
- history 改成 模式_前端路由三种模式
hash:任何情况下都可以做前端路由,缺点是SEO不友好(服务器收不到hash,浏览器是不会把#后面的内容发给服务器) history模式:后端将所有前端路由都渲染到同一个页面(不能是404页面),缺 ...
- postman如何改成中文版_在 Windows 上如何用 Postman 重现 Dubbo 反序列化漏洞
Dubbo 2.7.5 以下的版本暴出了一个反序列化漏洞,那么如何在 windows 上重现这个漏洞呢? 1. 下载官方 demo 代码(暴出的漏洞是 http 协议的,故使用 http 的 demo ...
- java改成字体_更改JRE字体配置
(1) JRE 1.4 的字体配置文件以及配置语法 关于 JRE1.4 的字体配置方法可参考 Sun 网站上的专门介绍: http://java.sun.com/j2se/1.4.2/docs/gui ...
最新文章
- @SupperssWarnings注解
- Web 服务器-Apache详解
- redis简单学习3-redis常用命令总结
- 信息学竞赛的常数优化、常见问题、代码风格相关
- 给csdn-blog开发组的建议(Kevins)
- Spring Boot集成Redis缓存之注解方式
- ansj 自定义 停用词_构造自定义停用词列表的快速提示
- ~~约数个数(附模板题)
- zabbix 调用api 批量删除主机
- 服务器(Windows系统)自建蚂蚁(leanote)笔记超详细步骤(包含数据备份和数据还原)
- 《程序设计基础课程设计》实验报告
- yylabel 加载html,YYLabel的富文本设置
- oracle设置自增序列,oracle设置自增字段,oracle序列
- 不同类型的Syslinux 引导
- SYNPROXY抵御DDoS攻击的原理和优化
- 台式电脑点关闭计算机关不了,台式电脑关机关不了怎么办
- 亚马逊AWS EC212个月免费计划及连接问题
- 微软客户体验中心感受
- 动作捕捉在各大领域的应用效果展示
- 联想手机吹响反攻号角,“诺曼底计划”未来要剑指何方?
热门文章
- VMware创建Linux及局域网内独立访问IP和访问外网IP的配置
- ios如何获取gps坐标(定位第二节)
- 让IT工作者过度劳累的12个坏习惯
- python判断是否为完全数_Python识别完美数
- 服务器centos怎么部署_我什么都不会,怎么拥有自己的个人博客呢
- ts语音自建服务器,自建TeamSpeak语音服务器,免费提供给专注游戏的玩家使用!...
- [转载] Java中的命名参数
- 判断五个分数等级划分_压力表精度等级怎么算?压力表精度等级划分及检验项目...
- css 轨道,html-当其他轨道增加时,CSS网格的轨道不会缩...
- qt没有mysql文件夹_qt5-qt目录下没有mysql文件夹