rust 所有权_对所有权聪明

rust 所有权

使用更好的框架了解智能指针

如果您喜欢这篇文章,可以在我自己的博客上阅读此文章。

在2011年,C ++标准引入了unique_ptrshared_ptrweak_ptr和shared_ptr的原子副本。 标准库的所有主要发行商都立即完美地实现了所有这六个指针。

到2012年初,每个C ++开发人员都会快速阅读这些新的智能指针,并理解它们的重要性和用例。 紧随其后的是对大多数开源C ++库和项目进行了大规模重构,以使原始指针的使用无效。 私人公司,个人代码库和教材很快也随之而来。

在2018年,学习C ++的人几乎一直不知道原始指针是什么,直到他使用该语言已经几个月了。 它们仍然在各种边缘情况下使用,例如某些高性能数据结构和各种兼容性层。 但是,大多数应用程序已切换为仅使用智能指针并在此正确使用它们。 从而使我们的代码更安全,更易于阅读,修改和推理。

那么出了什么问题呢?

好吧,很多事情出了问题,我没有时间在这里重复所有这些。 但是,亲爱的读者,我想告诉您的是,智能指针未得到充分使用并且shared_ptr经常被滥用的原因之一是我们误解了它们背后的主要概念。

智能指针与所有权有关

许多人似乎认为唯一指针是使原始指针自由使用的一种机制。 甚至更多的人将shared_ptr视为C ++的“垃圾收集”指针,使用和滥用的方式与对待JVM对象引用的方式相同。 智能指针确实确实在不再需要资源时释放了资源,但是,该语句的重要部分不是“空闲”部分,而是“不再需要时”部分。

智能指针代表一种表达资源所有权的方式。 它们是一种工具,可以帮助我们和未来的开发人员了解我们如何使用资源。 通过这样做,它们还碰巧帮助我们避免了无用后使用和内存泄漏,但是这些都是其实际目的的副作用。

唯一指针

std :: unique_ptr实际上没有开销,并且行为非常可预测。 基础资源在存在范围时会被破坏,可以移动但不能复制。 它旨在表示由单个子例程拥有但需要动态分配的资源。 用例包括必须花费昂贵的代价来复制没有mctor的资源,在线程之间传递资源,单例或pimpl的各种实现以及与使用指针的C库的兼容性。

该指针特别好,因为您可以对其应用与在堆栈上声明的值相同的推理。 它会积极阻止您在出现免费错误或与其他线程错误共享后开始使用。

共享指针

这个有点棘手。 这很昂贵,使用起来很危险,因为它以一种“更宽松”的方式表示所有权。 它主要用于多线程资源共享,并向您保证基本资源不会被另一个线程释放。 如果您具有必须返回共享资源的函数或方法,则此指针特别令人惊奇,因为调用者会立即意识到这一点,因此它也可以用于实现许多更高级别的状态共享机制。

共享指针的最大问题是它经常被代替唯一指针或弱指针来使用,从而导致代码混乱和性能下降。

弱指针

最后,我们进入std :: weak_ptr,这可能是三个中使用最多的。 该指针应用于引用共享资源,该共享资源的寿命不受指针所有者的控制。 当外部实体希望公开一个对象而又不完全赋予您该资源的所有权时,这将非常有用。

该指针的明显问题是人们可能会倾向于立即将其变为共享指针并继续使用它,而不是每次使用后都释放所有权。 方便地,此指针最明显的使用模式将阻止人们这样做:

本质上,此指针是最接近原始指针的指针。 但是,它提供了一种智能安全机制,当您希望使用它拥有的资源时,会强制将nullptr检查与临时共享所有权结合在一起。 这样可以防止您在不知不觉中使用悬空指针。

最后,一些代码

我发现令人惊讶的一件事是,几乎没有代码示例将原始指针的使用与智能指针的使用进行比较。 因此,这里有一个示例来说明与原始指针方法相比,这三种所有权语义如何提供帮助:

因此,最明显的答案是,我们应该阅读此Widget库的文档,并了解如何使用get_widget 。 但是,文档可能是错误的,它没有编译器来证明可以阅读。 文档也可能丢失,过时,或者由于各种因素,我们可能会误解它。

如果库的作者可以通过某种方式(我们(C ++开发人员)必须阅读和理解)进行通信,以使用此小部件的预期使用模式,该怎么办? 库本身的接口。 让我们看看会如何:

展览A

假设一旦我们请求一个小部件,就将使用和滥用它。 由于所有权以外的原因,该库为我们提供了一个指针,而不是对象本身。

在这种情况下,我们只使用unique_ptr。

展览B

但是,如果图书馆的作者考虑到多个用户怎么办。 也许小部件的构造确实很昂贵,或者它们是必须共享的单个硬件设备的直接接口?

展览C

如果我根本不希望小部件用户真正“拥有”小部件怎么办? 我的图书馆应该决定在何时以及是否销毁小部件……当然,是在合理的范围内(例如,不要在使用小部件时销毁它)。

在这里,您将看到有关如何通过3种类型的智能指针表示所有权语义的简单明了的示例。

显然,智能指针不能涵盖所有边缘情况,尤其是在无锁代码中进行有效资源管理时。 但是,它们涵盖了大多数常见问题。

我认为,这就是我们应该如何通过所有权的角度而不是RAII看待智能指针。

如果您喜欢这篇文章,您可能还会喜欢:

翻译自: https://hackernoon.com/being-smart-about-ownership-5ba2569a3ed7

rust 所有权

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值