C++中为什么永远不要使用原始指针或引用传递所有权
本篇内容主要讲解“C++中为什么永远不要使用原始指针或引用传递所有权”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“C++中为什么永远不要使用原始指针或引用传递所有权”吧!
成都创新互联长期为上1000+客户提供的网站建设服务,团队从业经验10年,关注不同地域、不同群体,并针对不同对象提供差异化的产品和服务;打造开放共赢平台,与合作伙伴共同营造健康的互联网生态环境。为海北州企业提供专业的网站设计制作、成都做网站,海北州网站改版等技术服务。拥有十多年丰富建站经验和众多成功案例,为您定制开发。
Reason(原因)
如果一个对象是属于调用者还是被调用者存在任何疑问的话,就可能发生泄漏或过早销毁。
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 anowner
. Suggest use of standard-library resource handle or use ofowner
.(简单)在删除原始指针而不是owner
时报警。建议使用标准库中的资源句柄或者owner (Simple) Warn on failure to either
reset
or explicitlydelete
anowner
pointer on every code path.(简单)如果任何代码路径上的owner指针的重置或删除操作发生失败,报警。
(Simple) Warn if the return value of
new
or a function call with anowner
return value is assigned to a raw pointer or non-owner
reference.(简单)如果new或者返回owner的函数调用的结果被分配给原始指针或者非owner引用,报警。
到此,相信大家对“C++中为什么永远不要使用原始指针或引用传递所有权”有了更深的了解,不妨来实际操作一番吧!这里是创新互联网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!
当前标题:C++中为什么永远不要使用原始指针或引用传递所有权
文章源于:http://scyanting.com/article/gijphe.html