Skip to content

Rc<T>:引用计数

基本用法

rust
use std::rc::Rc;

fn main() {
    // 创建引用计数
    let a = Rc::new(String::from("Hello"));

    // 克隆(增加引用计数,不复制数据)
    let b = Rc::clone(&a);
    let c = Rc::clone(&a);

    // 引用计数
    println!("引用计数:{}", Rc::strong_count(&a));  // 3

    // 检查是否唯一
    if Rc::unique(&a) {
        println!("a 是唯一引用");
    } else {
        println!("a 有多个引用");  // 输出这个
    }

    drop(b);
    println!("引用计数:{}", Rc::strong_count(&a));  // 2

    drop(c);
    println!("引用计数:{}", Rc::strong_count(&a));  // 1
}  // 引用计数为 0,数据释放
▶ Run

使用场景:共享所有权

rust
use std::rc::Rc;

enum List {
    Cons(i32, Rc<List>),
    Nil,
}

use List::{Cons, Nil};

fn main() {
    let a = Rc::new(Cons(1, Rc::new(Cons(2, Rc::new(Nil)))));
    println!("初始计数:{}", Rc::strong_count(&a));  // 1

    // b 和 c 共享 a 的数据
    let b = Cons(3, Rc::clone(&a));
    println!("创建 b 后:{}", Rc::strong_count(&a));  // 2

    let c = Cons(4, Rc::clone(&a));
    println!("创建 c 后:{}", Rc::strong_count(&a));  // 3

    // a, b, c 都指向相同的尾部
}
▶ Run