引用计数 Rc 数据类型
RUST
提供了一个名为Rc<T>
的类型来支持多重所有权,Rc
是Reference counting
的缩写。Rc<T>
类型实例会在内部维护一个用于记录值引用次数的计数器,从而确定这个值是否仍在使用。如果一个值的引用次数为零,就意味着这个值可以被安全清理掉,而不会触发引用失效的问题。
你可以把Rc<T>
想象成客厅的电视,在第一个人打开电视之后,后续进入客厅的其他人都可以直接观看电视。电视会一直保持开启状态直到最后一个人离开时关闭,因为此时不需要再使用电视了。
当你希望将堆上的一些数据分享给程序的多个部分同时使用,而又无法在编译器确定哪个部分会最后释放这些数据时,我们就可以使用Rc<T>
类型。
需要注意的是,Rc<T>
只能被用于单线程场景中。
使用Rc<T>
共享数据
基于Box<T>
无法实现下面的场景,Cons
变体有持有它存储的数据,因此,整个a
列表所有权会在创建b
列表时被移动到b
中。换句话说,b
持有了a
列表的所有权。当我们随后再次使用a
来创建c
列表时就会出现编译错误。
use crate::List::{Cons, Nil};
enum List {
Cons(i32, Box<List>),
Nil,
}
fn main() {
let a = Cons(5, Box::new(Cons(10, Box::new(Nil))));
let b = Cons(3, Box::new(a));
let c = Cons(4, Box::new(a));
}