07-智能指针
原创...大约 2 分钟
Box<T>
RC<T>
由于rust的数据的所有权默认随着赋值(读取)而转移,但有时一个值会有多个所有者,为了支持多重所有权,我们使用:RC<T>
比如数据需要被程序的多个部分读取(只读),编译者无法确定哪个部分最后使用完这些数据时应该使用RC<T>
特点
支持多重所有权
只适用于单线程场景
不可变引用,共享只读数据
RC<T>
不在预倒入模块,需要使用std::rc::Rc
导入
引用方式
Rc::clone(&a)
: 增加引用计数Rc::strong_count(&a)
: 获得引用计数(强引用)Rc::weak_count
: 获得引用计数(弱引用)。
报错:因为无法两次调用
enum List{
Cons(i32, Box<List>),
Nil
}
use crate::List::{Cons, 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));
}
- 将
Box<T>
替换为Rc<T>
use stand
enum List{
Cons(i32, Rc<List>),
Nil
}
use crate::List::{Cons, Nil};
fn main() {
let a = Rc::new(Cons(5,
Rc::new(Cons(10,
Rc::new(Nil)))));
let b = Cons(3, Rc::clone(&a));
let c = Cons(4, Rc::clone(&a));
}
// todo 打印引用的次数
use std::rc::Rc;
enum List{
Cons(i32, Rc<List>),
Nil
}
use crate::List::{Cons, Nil};
fn main() {
let a = Rc::new(Cons(5,
Rc::new(Cons(10,
Rc::new(Nil)))));
println!("count after creating a: {}",
Rc::strong_count(&a));
let b = Cons(3, Rc::clone(&a));
println!("count after creating b: {}",
Rc::strong_count(&a));
{let c = Cons(4, Rc::clone(&a));
println!("count after creating b: {}",
Rc::strong_count(&a));
} // todo 上节课内容,所有权以括号内部计算
println!("count after c goes out of scope: {}",
Rc::strong_count(&a));
}
count after creating a: 1
count after creating b: 2
count after creating b: 3
count after c goes out of scope: 2
Powered by Waline v3.1.3