文章目录
- 智能指针
- `Box<T>`
- `Rc<T>`
- `Weak<T>`
- 方法
- `Arc<T>`
- `RefCell<T>`
- 方法
- `Ref<T>`和`RefMut<T>`
- 常见使用方式
智能指针
Box<T>
- 数据存储在堆上
- 只能有一个所有者
Rc<T>
- 单线程,引用计数
- 不可变
- 需要主要避免循环引用
Weak<T>
弱引用,无需计数为0就可以清理内存。
方法
let value = Rc::new();
Rc::strong_count(&value); // 查看当前的引用计数
Rc::weak_count(&value); // 查看当前的弱引用计数
Arc<T>
- 多线程,原子引用计数,与
Rc<T>
类似
RefCell<T>
- 内部可变性,可以使用借用规则修改数据
- 只能有一个所有者
方法
.borrow_mut()
; 可变借用,只允许一个否则会报错already borrowed: BorrowMutError
。.borrow();
不可变借用
Ref<T>
和RefMut<T>
可变借用与不可变借用智能指针类型。
常见使用方式
let value = Rc::new(RefCell::new(5)); // 是的value的多个所有者可以改变value数值