Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

智能指针

指针(pointer)是一个通用概念,指的是包含内存地址的变量。这个地址引用,或者说“指向“另一些数据。Rust 中最常见的指针是引用(reference),你已经在第四章中学习过了。引用以 & 符号表示,会借用它们所指向的值。除了引用数据之外,引用没有任何特殊功能,也没有额外开销。

另一方面,智能指针(smart pointers)是一类数据结构,它们的行为类似于指针,但拥有额外的元数据和功能。智能指针的概念并非 Rust 独有:智能指针起源于 C++,也存在于其他语言中。Rust 在标准库中定义了多种智能指针,它们提供了超出引用所能提供的功能。为了探索这一通用概念,我们将看几个不同的智能指针示例,包括引用计数(reference counting)智能指针类型。这种指针通过记录所有者的数量来允许数据拥有多个所有者,并在没有任何所有者时清理数据。

在 Rust 中,由于所有权(ownership)和借用(borrowing)的概念,引用和智能指针之间还有一个额外的区别:引用只是借用数据,而在很多情况下,智能指针拥有它们所指向的数据。

智能指针通常使用结构体来实现。与普通结构体不同的是,智能指针实现了 DerefDrop trait。Deref trait 使智能指针结构体的实例能够像引用一样使用,这样你编写的代码既可以用于引用,也可以用于智能指针。Drop trait 允许你自定义当智能指针实例离开作用域时运行的代码。在本章中,我们将讨论这两个 trait,并说明它们对智能指针的重要性。

鉴于智能指针模式是 Rust 中经常使用的通用设计模式,本章不会涵盖所有现有的智能指针。许多库都有自己的智能指针,你甚至可以编写自己的智能指针。我们将介绍标准库中最常用的智能指针:

  • Box<T>,用于在堆上分配值
  • Rc<T>,一种引用计数类型,允许多重所有权
  • Ref<T>RefMut<T>,通过 RefCell<T> 访问,这是一种在运行时而非编译时执行借用规则的类型

此外,我们还将介绍内部可变性(interior mutability)模式,在这种模式中,一个不可变类型暴露出用于修改其内部值的 API。我们还将讨论引用循环(reference cycles):它们如何导致内存泄漏,以及如何防止引用循环。

让我们开始吧!