为什么在Rust中克隆Rc指针会增加其strong_count?

v7pvogib  于 2023-02-04  发布在  其他
关注(0)|答案(1)|浏览(149)

我有这个功能:

use std::rc::Rc;

fn rc_counter() -> Rc<String> {
    let p1 = Rc::new(String::from("Hello"));
    println!("count {}", Rc::strong_count(&p1)); // 1
                                                 // this is an owned type not a reference
    let p2 = p1.clone();
    println!(
        "Count after the clone is created for the pointer {}",
        Rc::strong_count(&p1)
    ); // 2
    p2
}

1.我创建了p1指针。将其强计数打印为1
1.然后我克隆了它,检查了p1的强计数,它输出了2。
据我所知,克隆的意思是,复制堆栈中的指针,复制堆中的数据。但是看起来克隆的p2仍然与p1相关。这怎么可能呢?

ee7vknir

ee7vknir1#

这就是Rc的全部意义-Rc是一个引用计数智能指针,用于共享所有权,它使多个所有者同时拥有它成为可能。
为了不违反Rust的所有权规则,所有所有者只能访问它不可变,虽然。
出于这个原因,.clone()有点不受欢迎,因为它不能使它清楚地可读,无论它是克隆Rc还是内部对象。
在您的示例中,p1.clone()等效于Rc::clone(&p1)
如果您想克隆内部的String,则需要执行String::clone(&p1)(*p1).clone()
据我所知,克隆的意思是,复制堆栈中的指针,复制堆中的数据。但看起来克隆的p2仍然与p1相关。
您正在描述Box的行为。如果您希望堆上的对象具有非共享所有权,并且如果您克隆它,它也会克隆堆上的对象,请使用Box而不是Rc。除了Rc用于共享所有权之外,两者非常相似。

相关问题