本篇内容主要讲解“C++中为什么永远不要使用原始指针或引用传递所有权”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“C++中为什么永远不要使用原始指针或引用传递所有权”吧!
如果一个对象是属于调用者还是被调用者存在任何疑问的话,就可能发生泄漏或过早销毁。
Example(示例)
Consider:(考虑)
X* compute(args) // don't{ X* res = new X{}; // ... return res;}
应该由谁删除返回的X? 当compute返回一个参照的时候,这个问题会很难判断。考虑返回一个值(如果结果很大则使用移动语法)
译者注:移动语法指的是C++11开始引入的右值引用和std::move。
vector<double> compute(args) // good{ vector<double> res(10000); // ... return res;}
其他选项:使用“智能指针”传递所有权,例如unique_ptr(用于独占所有权)和shared_prt(用于共享所有权)。然而这种做法和直接返回对象本身相比稍微欠缺一点优雅和效率,因此应该只在需要参照语义时才需要智能指针。
其他选项:有时因为ABI兼容性的要求或者需要避免资源泄漏而无法修改旧代码。在这种情况下,使用准则支持库提供的owner形式来标记控制所有权的指针。
译者注:ABI,由操作系统提供的应用程序二进制接口(Application Binary Interface)
owner<X*> compute(args) // It is now clear that ownership is transferred{ owner<X*> 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<T>
. Suggest use of standard-library resource handle or use of owner<T>
.
(简单)在删除原始指针而不是owner<T>时报警。建议使用标准库中的资源句柄或者owner<T>
(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++中为什么永远不要使用原始指针或引用传递所有权”有了更深的了解,不妨来实际操作一番吧!这里是亿速云网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。