文章目录
在 Rust 中,智能指针(Smart Pointers) 是对普通指针的封装,除了指向某个值,它们还拥有额外的行为(比如自动释放资源、共享所有权、内变性等)。
智能指针在 Rust 中广泛用于内存管理和所有权系统。
常见的智能指针类型
1. Box<T>
— 堆上分配的数据
- 用途:将数据存储在堆上,适用于大小不确定的类型(如递归类型)。
- 特点:唯一所有权,开销小,支持解引用。
let b = Box::new(5);
println!("{}", *b); // 解引用输出 5
2. Rc<T>
— 引用计数的共享所有权(单线程)
- 用途:多个所有者共享同一份堆内数据(适用于不可变数据)。
- 特点:只适用于单线程,不可变共享,内部使用引用计数。
use std::rc::Rc;
let a = Rc::new(5);
let b = Rc::clone(&a);
println!("Count: {}", Rc::strong_count(&a)); // Count: 2
3. Arc<T>
— 原子引用计数(多线程)
- 用途:在多线程中安全共享所有权。
- 特点:线程安全(用原子操作实现),开销比
Rc
大。
use std::sync::Arc;
use std::thread;
let a = Arc::new(5);
let b = Arc::clone(&a);
thread::spawn(move || {
println!("From thread: {}", b);
});
4. RefCell<T>
— 运行时可变借用(单线程)
- 用途:在不可变环境中实现内部可变性(Interior Mutability)。
- 特点:运行时检查借用规则,适合单线程。
- 常与
Rc
一起用来构建复杂结构(如图、树)。
use std::cell::RefCell;
let x = RefCell::new(5);
*x.borrow_mut() = 10;
println!("{}", x.borrow()); // 输出 10
5. Mutex<T>
与 RwLock<T>
— 多线程的可变共享
- 用途:实现线程间的可变访问控制。
Mutex<T>
:一次只能一个线程访问。RwLock<T>
:可以多个读者或一个写者。
use std::sync::Mutex;
let data = Mutex::new(5);
{
let mut guard = data.lock().unwrap();
*guard = 10;
}
println!("{:?}", data.lock().unwrap()); // 输出 10
综合对比表
类型 | 所有权共享 | 可变性 | 是否线程安全 | 应用场景 |
---|---|---|---|---|
Box<T> | ❌ | ✅ | ✅ | 堆分配、递归结构 |
Rc<T> | ✅ | ❌ | ❌ | 单线程多所有者共享 |
Arc<T> | ✅ | ❌ | ✅ | 多线程共享数据 |
RefCell<T> | ✅ | ✅ | ❌ | 单线程内部可变性 |
Mutex<T> | ✅ | ✅ | ✅ | 多线程可变性控制 |