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

15.0 智能指针(序):什么是智能指针及Rust智能指针的特性

15.0.1 指针的基本概念

指针是一个变量,它保存内存中的某个地址,并指向另一份数据。

Rust 中最常见的指针是引用,使用 & 符号表示,它会借用所指向的值。除了引用数据之外,它们没有任何特殊行为,也没有额外开销。

15.0.2 智能指针简介

智能指针的概念并非 Rust 独有:它起源于 C++,也存在于其他语言中。

Rust 标准库定义了多种智能指针。它们提供的能力超出了普通引用所能做到的范围。

智能指针的行为与指针类似,但提供了额外的元数据和功能。

15.0.3 智能指针与引用的区别

  • 引用只能借用数据,而智能指针通常拥有它指向的数据。
  • 智能指针具有额外的元数据和功能,例如自动清理和其他保障。

15.0.4 智能指针的常见类型

1. 引用计数类型

引用计数智能指针通过记录所有者的数量,支持多重所有权。当不再有任何使用者时,它们会自动清理数据。

2. 标准库中的智能指针

在前文中,我们已经接触过一些智能指针,例如:

  • String:拥有一片内存区域,并保障其数据是合法的 UTF-8。
  • Vec<T>:提供容量等元数据,并允许操作动态数组。

15.0.5 智能指针的实现

智能指针通常通过 struct 实现,但与普通结构体不同的是,它们一般会实现以下两个重要的 trait:

  • Deref:允许智能指针的实例表现得像引用,使程序可以同时支持引用和智能指针。
  • Drop:允许程序员自定义智能指针实例离开作用域时运行的清理代码。

在本章中,我们将讨论这两个 trait,并说明它们对智能指针为何重要。

15.0.6 本章内容

由于智能指针是一种常见的设计模式,本章将重点介绍标准库中最常用的智能指针类型:

  • Box<T>:最简单的智能指针,将数据存储在堆上。
  • Rc<T>:引用计数智能指针,支持共享所有权。
  • Ref<T>RefMut<T>:通过 RefCell<T> 访问的值,它在运行时而不是编译时强制执行借用规则。

此外,本章还将讨论以下主题:

  • 内部可变性模式 (Interior Mutability Pattern):一种允许不可变类型暴露可修改其内部值的 API 的设计模式。
  • 引用循环 (Reference Cycles):它如何导致内存泄漏以及如何预防。

读完本章后,你将对 Rust 中智能指针及相关设计模式的使用有更深入的理解。