1. 概述
指针:一个变量在内存中包含的是一个地址(指向其他数据),该变量就是一个指针。
在Rust中最常见的指针就是"引用"。
引用:
- 使用
&
标注 - 借用它指向的值
- 而且没有其余的开销
- 最常见的指针类型
智能指针是这样的一些数据结构:
- 行为和指针相似
- 有额外的元数据和功能
2. 引用计数(reference counting)智能指针类型
引用计数智能指针是通过记录所有者的数量,使一份数据被多个所有者同时持有,并在没有任何所有者时自动清理数据。
通过这个概念我们得知引用和智能指针有所不同:
- 引用:是借用数据
- 智能指针:很多时候都拥有它所指向的数据。
以下是智能指针的例子
String
Vec<T>
特点:
- 它们都拥有一片内存区域,并且允许用户对其操作
- 而且它们还有元数据,例如容量等
- 提供额外的功能或保障,如String保障其数据都是合法的UTF8编码
3. 智能指针的实现
智能指针通常使用struct实现,和一般结构体不同的是,智能指针的结构体通常会实现Deref
和Drop
这两个Trait。
- Deref trait:允许智能指针struct的实例像引用一样使用
- Drop trait:允许你自定义当智能指针实例离开作用域时运行的代码
4. 智能智能的内容
在下面几节中,将介绍标准库中常见的智能指针
Box<T>
:在heap内存上分配Rc<T>
:启用多重所有权的引用计数类型Ref<T>
和RefMut<T>
,通过RefCell<T>
访问:在运行时而不是编译时强制借用规则的类型
此外还将介绍以下两个知识点
- 内部可变模式(interior mutability pattern):不可变类型暴露出可修改其内部值的API
- 循环引用(reference cycles):它们如何泄露内存,以及如何防止其发生