跳至主要內容

07-智能指针

黑静美原创...大约 2 分钟编程rust

Box<T>

RC<T>

由于rust的数据的所有权默认随着赋值(读取)而转移,但有时一个值会有多个所有者,为了支持多重所有权,我们使用:RC<T>

比如数据需要被程序的多个部分读取(只读),编译者无法确定哪个部分最后使用完这些数据时应该使用RC<T>

特点
引用方式
  • 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(4Rc::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
上次编辑于:
贡献者: Heijingmei
评论
  • 按正序
  • 按倒序
  • 按热度
Powered by Waline v3.1.3