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