当前位置: 代码迷 >> 综合 >> Rust 中的 Rc智能指针
  详细解决方案

Rust 中的 Rc智能指针

热度:90   发布时间:2023-12-12 15:22:46.0

Rust 中的 Rc智能指针

1 初识 Rc

先看个简单例子:

use std::rc::Rc;
fn main() {
    let x = Rc::new(123);println!("{:?}", x);
}
---------------------------------------------------
cargo run
123

这个与 Box 指针几乎一样,二者区别在于 clone() 的具体执行过程。

2 clone() 方法

看下面的例子:

use std::rc::Rc;
fn main() {
    let x = Rc::new(123);let y = x.clone();println!("{:?}, {:?}", x, y);
}
---------------------------------------------------
cargo run
123, 123

看上去与 Box 没啥区别。我们可以把 Rc 换成 Box,结果是一样的。它们的区别在于内部执行过程。Rc 的这个 clone(),并没有真的复制数据,而是共享了同一份数据的地址,并利用一个内部计数器记录引用次数。每次执行 clone() 方法时,计数器加一,每次执行drop() 方法时,计数器减一。一旦计数器为零,则清理实际数据。

个人感觉,这套机制比 C++ 的智能指针实现起来容易,理解起来更容易,用起来更不容易出错。回头我会写一篇与 C++ 智能指针实现机制比较的文章。