Rust 智能指针入门
学习 Box、Rc 和 RefCell 智能指针的概念与使用场景 · 难度:入门 · +15XP
智能指针概述
智能指针是实现了 Deref 和 Drop trait 的结构体,它们不仅像普通指针一样指向数据,还拥有额外的元数据和功能。Rust 标准库提供了多种智能指针,用于不同的内存管理需求。
Box<T> —— 堆分配
Box<T> 是最简单的智能指针,它将数据存储在堆上,栈上只保留指向堆的指针。适合以下场景:
- 递归类型(如链表)
- 在编译时大小未知的类型
- 需要转移所有权但不想复制大块数据
fn main() {
let b = Box::new(5);
println!("b = {}", b); // 自动解引用
}Rc<T> —— 引用计数
Rc<T> 允许多个所有者共享同一数据,通过引用计数管理生命周期。注意:Rc 只适用于单线程场景。
| 方法 | 说明 |
|---|---|
| Rc::new | 创建新实例,初始引用计数为1 |
| Rc::clone | 增加引用计数(不深拷贝) |
| Rc::strong_count | 获取当前强引用数 |
use std::rc::Rc;
let a = Rc::new(5);
let b = Rc::clone(&a);
println!("引用计数: {}", Rc::strong_count(&a)); // 输出 2
RefCell<T> —— 内部可变性
RefCell<T> 在运行时检查借用规则,允许在不拥有可变引用的情况下修改数据。常与 Rc 组合使用。
练习提示: 尝试用 Rc<RefCell<i32>> 实现一个可被多个变量共享并修改的计数器。