智能指针

指针是包含 记忆。此地址引用或“指向”其他一些数据。最 Rust 中常见的指针类型是引用,你在 第 4 章.引用由符号指示,并借用它们的值 指向。除了引用 data 的 ID 值,并且没有开销。&

另一方面,智能指针是类似于 指针,但还具有其他元数据和功能。的概念 智能指针并不是 Rust 独有的:智能指针起源于 C++ 并存在 其他语言也是如此。Rust 在 标准库,该库提供的功能超出了引用提供的功能。 为了探索一般概念,我们将看几个不同的例子 智能指针,包括引用计数智能指针类型。这 pointer 允许您通过跟踪 所有者的数量,如果没有所有者,则清理数据。

Rust 的所有权和借用概念还有一个额外的区别 Between references and smart pointers:虽然引用仅借用数据,但在 在许多情况下,智能指针拥有它们指向的数据。

虽然我们当时没有这样称呼他们,但我们已经遇到了一些 Smart Pointers,包括 和 第 8 章。双 这些类型算作智能指针,因为它们拥有一些内存,并允许 来纵它。它们还具有元数据和额外的功能或保证。,例如,将其容量存储为元数据,并具有额外的 确保其数据始终有效的 UTF-8 的能力。StringVec<T>String

智能指针通常使用结构实现。与普通 struct 中,智能指针实现 and trait。该 trait 允许智能指针结构体的实例表现得像一个引用 因此,您可以编写代码以使用引用或智能指针。 该 trait 允许您自定义在实例 的智能指针超出范围。在本章中,我们将讨论两者 trait 并演示它们对 Smart Pointer 的重要性。DerefDropDerefDrop

鉴于智能指针模式是使用的一般设计模式 在 Rust 中,本章通常不会涵盖所有现有的智能指针。多 库有自己的智能指针,您甚至可以编写自己的智能指针。我们将 涵盖 Standard 库中最常见的 Smart Pointers:

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

此外,我们还将介绍内部可变性模式,其中不可变的 type 公开了一个用于更改 interior 值的 API。我们还将讨论引用循环:它们如何泄漏内存以及如何防止它们。

让我们开始吧!

本文档由官方文档翻译而来,如有差异请以官方英文文档(https://doc.rust-lang.org/)为准