指针 是一个包含内存地址的变量 ,是一个通用概念。
Rust 中最常见的指针就是引用。引用的特点:
- 使用
&
- 借用它指向的值
- 没有额外开销
- 最常见的指针类型
智能指针 smart pointers
本章介绍智能指针,起源于 C++。智能指针是这样一些数据结构:
- 行为和指针类似
- 有额外的元数据和功能
Rust 标准库中不同的智能指针提供了多于引用的额外功能。
本章将会探索的一个例子便是 引用计数 (reference counting)智能指针类型,其允许数据有多个所有者。引用计数智能指针记录总共有多少个所有者,并当没有任何所有者时负责清理数据。
引用和智能指针的其他不同
- 引用:只借用数据
- 智能指针:很多时候都拥有它所指向的数据
智能指针的例子
String
和Vec<T>
- 都拥有一片内存区域,且允许用户对其操作
- 还拥有元数据(例如容量)
- 提供额外的功能或保障(String 保障数据是合法的UTF-8 编码)
智能指针的实现
- 通常使用 struct 实现,并且实现了:Deref 和 Drop 这两个 Trait
Deref
Trait:允许智能指针 struct 的实例像引用一样使用Drop
Trait:允许你自定义当智能指针离开作用域时的代码
本章内容
介绍标准库中常见的智能指针:
Box<T>
,用于在堆上分配值Rc<T>
,一个引用计数类型,其数据可以有多个所有者Ref<T>
和RefMut<T>
,通过RefCell<T>
访问。(RefCell<T>
是一个在运行时而不是在编译时执行借用规则的类型)。
此外:
- 内部可变性(interior mutability)模式,这是不可变类型暴露出改变其内部值的 API。
- 引用循环(reference cycles)会如何泄漏内存,以及如何避免。