智能指针
指针是包含内存中地址的变量的一般概念。此地址引用或“指向”其他一些数据。Rust 中最常见的指针类型是引用,你在 第 4 章 中学到了这一点。引用由&
符号表示,并借用它们指向的值。除了引用数据之外,它们没有任何特殊功能,并且没有开销。
另一方面,智能指针是数据结构,其作用类似于指针,但也具有额外的元数据和功能。智能指针的概念并不是 Rust 独有的:智能指针起源于 C++,也存在于其他语言中。Rust 在标准库中定义了各种智能指针,它们提供的功能超出了引用提供的功能。为了探索一般概念,我们将查看智能指针的几个不同示例,包括引用计数智能指针类型。通过此指针,您可以通过跟踪所有者的数量来允许数据具有多个所有者,并在没有所有者时清理数据。
Rust 的所有权和借用概念在引用和智能指针之间还有一个额外的区别:虽然引用只借用数据,但在许多情况下,智能指针拥有它们指向的数据。
虽然我们当时没有这样称呼它们,但我们已经在本书中遇到了一些聪明的指针,包括第 8 章中的 String
和 Vec<T>
。双
这些类型算作智能指针,因为它们拥有一些内存,并允许
来纵它。它们还具有元数据和额外的功能或保证。
例如,String
将其容量存储为元数据,并具有确保其数据始终有效的 UTF-8 的额外功能。
智能指针通常使用结构实现。与普通结构体不同,智能指针实现了 Deref
和 Drop
traits。Deref
trait 允许智能指针结构体的实例表现得像一个引用
因此,您可以编写代码以使用引用或智能指针。
Drop
trait 允许您自定义智能指针实例超出范围时运行的代码。在本章中,我们将讨论这两个特征,并演示为什么它们对智能指针很重要。
鉴于智能指针模式是 Rust 中经常使用的通用设计模式,本章不会涵盖所有现有的智能指针。许多库都有自己的智能指针,您甚至可以编写自己的智能指针。我们将介绍标准库中最常见的智能指针:
用于在堆上分配值的Box<T>
Rc<T>
,一种支持多重所有权的引用计数类型Ref<T>
和RefMut<T>
,通过RefCell<T>
访问,该类型在运行时而不是编译时强制执行借用规则
此外,我们还将介绍内部可变性模式,其中不可变的
type 公开了一个用于更改 interior 值的 API。我们还将讨论
引用周期:它们如何泄漏内存以及如何防止它们泄漏。
让我们开始吧!