温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

C++中为什么永远不要使用原始指针或引用传递所有权

发布时间:2021-11-29 11:56:59 来源:亿速云 阅读:199 作者:iii 栏目:大数据

本篇内容主要讲解“C++中为什么永远不要使用原始指针或引用传递所有权”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“C++中为什么永远不要使用原始指针或引用传递所有权”吧!

Reason(原因)

如果一个对象是属于调用者还是被调用者存在任何疑问的话,就可能发生泄漏或过早销毁。

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++中为什么永远不要使用原始指针或引用传递所有权”有了更深的了解,不妨来实际操作一番吧!这里是亿速云网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

c++
AI