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++ 智能指针实现机制比较的文章。