本篇内容主要讲解“C++中为什么永远不要使用原始指针或引用传递所有权”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“C++中为什么永远不要使用原始指针或引用传递所有权”吧!
成都创新互联长期为上1000+客户提供的网站建设服务,团队从业经验10年,关注不同地域、不同群体,并针对不同对象提供差异化的产品和服务;打造开放共赢平台,与合作伙伴共同营造健康的互联网生态环境。为海北州企业提供专业的网站设计制作、成都做网站,海北州网站改版等技术服务。拥有十多年丰富建站经验和众多成功案例,为您定制开发。
如果一个对象是属于调用者还是被调用者存在任何疑问的话,就可能发生泄漏或过早销毁。
Example(示例)
Consider:(考虑)
X* compute(args) // don't{ X* res = new X{}; // ... return res;}
应该由谁删除返回的X? 当compute返回一个参照的时候,这个问题会很难判断。考虑返回一个值(如果结果很大则使用移动语法)
译者注:移动语法指的是C++11开始引入的右值引用和std::move。
vectorcompute(args) // good{ vector res(10000); // ... return res;}
其他选项:使用“智能指针”传递所有权,例如unique_ptr(用于独占所有权)和shared_prt(用于共享所有权)。然而这种做法和直接返回对象本身相比稍微欠缺一点优雅和效率,因此应该只在需要参照语义时才需要智能指针。
其他选项:有时因为ABI兼容性的要求或者需要避免资源泄漏而无法修改旧代码。在这种情况下,使用准则支持库提供的owner形式来标记控制所有权的指针。
译者注:ABI,由操作系统提供的应用程序二进制接口(Application Binary Interface)
ownercompute(args) // It is now clear that ownership is transferred{ owner res = new X{}; // ... return res;}
这样可以告诉分析工具res是所有者。也就是说,它的值必须被删除或者转移给其他的所有者,就像这里通过return返回结果时所做的一样。
在实现资源句柄的时候,owner也会以相似的方式被使用。
Note(注意)
所有通过原始指针(或迭代器)传递的对象都被假设由调用者所有,因此它的生命周期也由调用者管理。换一个角度:相对而言,和指针传递API相比,所有权转移API相当少,因此(大家)默认的情况是没有所有权转移。
Enforcement(实施建议)
(Simple) Warn on delete
of a raw pointer that is not an owner
. Suggest use of standard-library resource handle or use of owner
.
(简单)在删除原始指针而不是owner
(Simple) Warn on failure to either reset
or explicitly delete
an owner
pointer on every code path.
(简单)如果任何代码路径上的owner指针的重置或删除操作发生失败,报警。
(Simple) Warn if the return value of new
or a function call with an owner
return value is assigned to a raw pointer or non-owner
reference.
(简单)如果new或者返回owner的函数调用的结果被分配给原始指针或者非owner引用,报警。
到此,相信大家对“C++中为什么永远不要使用原始指针或引用传递所有权”有了更深的了解,不妨来实际操作一番吧!这里是创新互联网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!