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。

vector compute(args)  // good{    vector res(10000);    // ...    return res;}

其他选项:使用“智能指针”传递所有权,例如unique_ptr(用于独占所有权)和shared_prt(用于共享所有权)。然而这种做法和直接返回对象本身相比稍微欠缺一点优雅和效率,因此应该只在需要参照语义时才需要智能指针。

其他选项:有时因为ABI兼容性的要求或者需要避免资源泄漏而无法修改旧代码。在这种情况下,使用准则支持库提供的owner形式来标记控制所有权的指针。

译者注:ABI,由操作系统提供的应用程序二进制接口(Application Binary Interface)

owner compute(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时报警。建议使用标准库中的资源句柄或者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++中为什么永远不要使用原始指针或引用传递所有权”有了更深的了解,不妨来实际操作一番吧!这里是创新互联网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!


当前标题:C++中为什么永远不要使用原始指针或引用传递所有权
文章源于:http://scyanting.com/article/gijphe.html