智能指针
Rust提供了两种用于引用计数的智能指针:
- Rc
引用计数的指针,线程不安全。 - Arc
就线程安全的Rc。原子的引用计数指针,线程安全的。
Rust内存资源同一时刻只能有一个所有权拥有者。Rc和Arc使用引用计数法,让同一时刻实现资源有多个所有者权拥有者。
使用Rc
Rc 用于同一线程内部,通过 use std::rc::Rc 来引入。它有以下几个特点:
- 用 Rc 包装起来的类型对象,是只读的,是不可变的。
- 最后一个拥有者的作用域结束,则资源会被自动回收,这个生命周期是在编译期就确定下来的;
- Rc 只能用于同一线程内部,不能用于线程之间的对象共享(不能跨线程传递);
- Rc 实际上是一个指针,它不影响包裹对象的方法调用形式(即不需要先解开包裹再调用值)。
use std::rc::Rc;
let x = Rc::new(5i);
let y = x.clone();
当x和y都超出作用域后,内存即自动释放。
注意,如果存在循环引用。Rust无法帮助我们释放内存。从而引发内存泄漏。
使用 Weak 解决循环引用。
Arc
Arc 是原子引用计数,是 Rc 的多线程版本。Arc 通过 std::sync::Arc 引入。
特点:
- Arc 可跨线程传递,用于跨线程共享一个对象;
- 用 Arc 包裹起来的类型对象,对可变性没有要求;
- 最后一个拥有者的作用域结束,则资源会被自动回收,这个生命周期是在编译期就确定下来的;
- Arc 实际上是一个指针,它不影响包裹对象的方法调用形式(即不需要先解开包裹再调用值。);
- Arc 对于多线程的共享状态几乎是必须的(减少复制,提高性能)。