# 灵巧指针

所谓 *指针*，是个一般的概念，表示包含内存中某个地址的变量。这个地址引用，或者说 “指向” 某个别的数据。Rust 中最常见的指针类别属于引用，咱们在第 4 章中已经学过。引用以 `&` 符号表示，并借用他们指向的值。除了引用数据之外，他们没有任何特殊能力，并且没有开销。

另一方面，*灵巧指针* 属于数据结构，他们像指针一样工作，但还具有额外的元数据与能力。灵巧指针这一概念并非 Rust 独有：灵巧指针起源于 C++，也存在于其他语言中。Rust 在标准库中定义了各种灵巧指针，他们提供超越引用所提供的功能。为了探讨一般概念，我们将研究数个灵巧指针的不同示例，包括 *引用计数* 灵巧指针类型。这种指针让咱们可以通过跟踪所有者的数量，允许数据有多个所有者，并在没有所有者剩下时清理数据。

在 Rust 中，由于其所有权和借用的概念，引用和灵巧指针之间还有一个额外区别：引用只借用数据，而在许多情况下，灵巧指针 *拥有* 他们指向的数据。

灵巧指针通常使用结构体实现。不同于普通结构体，灵巧指针实现了 `Deref` 和 `Drop` 特质。

- `Deref` 特质允许灵巧指针结构体的实例可以像引用那样行事，从而咱们可以编写咱们的代码为既能处理引用，也能处理灵巧指针；
- `Drop` 特质允许咱们定制在灵巧指针超出作用域时要运行的代码。

在这一章中，我们将讨论这两个特质，并演示他们为何对灵巧指针很重要。

鉴于灵巧指针模式属于 Rust 中最常用到的通用设计模式，这一章不会介绍每种现有的灵巧指针。许多库都有自己的灵巧指针，咱们甚至可以编写自己的灵巧指针。我们将介绍标准库中最常见的灵巧指针：

- `Box<T>`，用于在内存堆上分配值；
- `Rc<T>`，一种引用计数类型，实现了多重所有权；
- `Ref<T>` 和 `RefMut<T>`，通过 `RefCell<T>` 访问，这是一种在运行时而不是编译时强制执行借用规则检查的类型。

此外，我们将介绍 *内部可变性* 模式，在这种模式下，不可变类型会暴露出用于修改内部值的 API。我们还将讨论引用循环：他们会怎样泄漏内存，以及如何防止他们。

让我们开始吧！

