mirror of
https://github.com/gnu4cn/rust-lang-zh_CN.git
synced 2026-08-19 12:43:28 +08:00
2.4 KiB
2.4 KiB
灵巧指针
所谓 指针,是个一般的概念,表示包含内存中某个地址的变量。这个地址引用,或者说 “指向” 某个别的数据。Rust 中最常见的指针类别属于引用,咱们在第 4 章中已经学过。引用以 & 符号表示,并借用他们指向的值。除了引用数据之外,他们没有任何特殊能力,并且没有开销。
另一方面,灵巧指针 属于数据结构,他们像指针一样工作,但还具有额外的元数据与能力。灵巧指针这一概念并非 Rust 独有:灵巧指针起源于 C++,也存在于其他语言中。Rust 在标准库中定义了各种灵巧指针,他们提供超越引用所提供的功能。为了探讨一般概念,我们将研究数个灵巧指针的不同示例,包括 引用计数 灵巧指针类型。这种指针让咱们可以通过跟踪所有者的数量,允许数据有多个所有者,并在没有所有者剩下时清理数据。
在 Rust 中,由于其所有权和借用的概念,引用和灵巧指针之间还有一个额外区别:引用只借用数据,而在许多情况下,灵巧指针 拥有 他们指向的数据。
灵巧指针通常使用结构体实现。不同于普通结构体,灵巧指针实现了 Deref 和 Drop 特质。
Deref特质允许灵巧指针结构体的实例可以像引用那样行事,从而咱们可以编写咱们的代码为既能处理引用,也能处理灵巧指针;Drop特质允许咱们定制在灵巧指针超出作用域时要运行的代码。
在这一章中,我们将讨论这两个特质,并演示他们为何对灵巧指针很重要。
鉴于灵巧指针模式属于 Rust 中最常用到的通用设计模式,这一章不会介绍每种现有的灵巧指针。许多库都有自己的灵巧指针,咱们甚至可以编写自己的灵巧指针。我们将介绍标准库中最常见的灵巧指针:
Box<T>,用于在内存堆上分配值;Rc<T>,一种引用计数类型,实现了多重所有权;Ref<T>和RefMut<T>,通过RefCell<T>访问,这是一种在运行时而不是编译时强制执行借用规则检查的类型。
此外,我们将介绍 内部可变性 模式,在这种模式下,不可变类型会暴露出用于修改内部值的 API。我们还将讨论引用循环:他们会怎样泄漏内存,以及如何防止他们。
让我们开始吧!