键盘快捷键

按 ← 或 → 在章节之间导航

按 S 或 / 在本书中搜索

按 ? 显示此帮助

按 Esc 隐藏此帮助

智能指针

指针是一个通用概念,指包含内存地址的变量。这个地址引用或者说“指向”其他数据。Rust 中最常见的指针类型是你在第 4 章学过的引用。引用用 & 符号表示,并借用其指向的值。除了引用数据之外,它们没有任何特殊能力,也没有任何开销。

另一方面,智能指针是行为类似指针、但带有额外元数据和能力的数据结构。智能指针的概念并非 Rust 独有:智能指针起源于 C++,也存在于其他语言中。Rust 的标准库中定义了多种智能指针,它们提供超出引用所能提供的功能。为了探索这个通用概念,我们将介绍几个不同的智能指针示例,包括引用计数智能指针类型。这种指针通过跟踪所有者的数量,使数据可以拥有多个所有者,并在没有所有者时清理数据。

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

智能指针通常使用结构体实现。与普通结构体不同,智能指针实现了 Deref 和 Drop trait。Deref trait 允许智能指针结构体的实例表现得像引用一样,这样你就可以编写既能用于引用、又能用于智能指针的代码。Drop trait 允许你自定义当智能指针实例离开作用域时运行的代码。在本章中,我们将讨论这两个 trait,并演示它们为何对智能指针如此重要。

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

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

此外,我们还将介绍内部可变性模式,即不可变类型暴露用于修改其内部值的 API。我们还会讨论引用循环:它们如何泄漏内存,以及如何避免。

让我们开始吧!