目录
什么是 Rust 智能指针
Rust 智能指针 (Smart Pointers) 是一种封装原始指针并提供额外功能的数据结构。它们不仅指向内存,还管理数据的生命周期和所有权,常见于 std::ptr
和 std::rc
等模块。
为什么要使用智能指针
- 资源管理:自动释放内存,避免手动操作。
- 所有权共享:允许多个引用访问同一数据。
- 安全性:防止悬垂指针和内存泄漏。
- 灵活性:支持复杂的数据结构(如循环引用)。
常用智能指针类型
Box<T>
:
- 单一所有权的堆分配指针。
- 用于将数据移到堆上。
Rc<T>
:
- 引用计数指针,允许多所有者。
- 单线程使用。
Arc<T>
:
- 原子引用计数指针,多线程安全。
RefCell<T>
:
- 提供内部可变性,运行时检查借用。
Mutex<T>
和RwLock<T>
:
- 线程安全的可变性控制。
智能指针的操作
Box<T>
:- 创建:
Box::new
。 - 解引用:
*
或.
。 Rc<T>
和Arc<T>
:- 克隆:
Rc::clone
或Arc::clone
。 - 获取引用计数:
Rc::strong_count
。 RefCell<T>
:- 借用:
borrow
(不可变)、borrow_mut
(可变)。 Mutex<T>
:- 锁定:
lock
返回MutexGuard
。
智能指针与所有权
Box<T>
:独占所有权,离开作用域时释放。Rc<T>
和Arc<T>
:共享所有权,引用计数为 0 时释放。RefCell<T>
:不改变所有权,提供运行时借用检查。- 线程安全:
Arc
和Mutex
确保并发安全。
代码示例
Box 使用
fn main() {
let b = Box::new(42);
println!("Box value: {}", *b);
} // b 离开作用域,自动释放
运行结果:
Box value: 42
Rc 共享所有权
use std::rc::Rc;
fn main() {
let data = Rc::new(String::from("Hello"));
let data2 = Rc::clone(&data);
println!("Data: {}, Count: {}", data, Rc::strong_count(&data));
println!("Data2: {}", data2);
}
运行结果:
Data: Hello, Count: 2
Data2: Hello
RefCell 内部可变性
use std::cell::RefCell;
fn main() {
let value = RefCell::new(5);
let mut borrowed = value.borrow_mut();
*borrowed += 10;
println!("Value: {}", *value.borrow());
}
运行结果:
Value: 15
Arc 与 Mutex 并发
use std::sync::{Arc, Mutex};
use std::thread;
fn main() {
let counter = Arc::new(Mutex::new(0));
let mut handles = vec![];
for _ in 0..5 {
let counter = Arc::clone(&counter);
let handle = thread::spawn(move || {
let mut num = counter.lock().unwrap();
*num += 1;
});
handles.push(handle);
}
for handle in handles {
handle.join().unwrap();
}
println!("Counter: {}", *counter.lock().unwrap());
}
运行结果:
Counter: 5
参考资料与出站链接
- 官方文档:
- 学习资源:
- 社区支持:
发表回复