首页 > 解决方案 > Rc::clone(&pointer) 如何增加引用计数?

问题描述

我看不出应该如何实现以下代码:

let a = Rc::new(5);
let b = Rc::clone(&a);
let c = Rc::clone(&a);

Rc::clone获取对 的不可变引用a,但以某种方式设法增加其引用计数(这需要可变引用?)。

我尝试检查Rc参见此处)的源代码,但以我目前有限的知识还无法理解它。

这是因为它unsafe在后台使用代码,还是发生了其他事情?

标签: rust

解决方案


在引擎盖下,Rc使用Cell,它可以实现内部可变性:

struct RcBox<T: ?Sized> {
    strong: Cell<usize>,
    weak: Cell<usize>,
    value: T,
}

最终,条条大路通Cell::replace。它不可避免地有一个不安全的块:

mem::replace(unsafe { &mut *self.value.get() }, val)

所以是的,你的直觉是对的!


推荐阅读