【问题标题】:Why does unwrapping a cloned Rc cause a panic?为什么解开克隆的 Rc 会导致恐慌?
【发布时间】:2021-06-07 02:54:41
【问题描述】:

为什么这段代码会在第 7 行出现恐慌? foo_unwrapped 不应该是第 5 行的 Some(3) 而不是 None 吗?

use std::rc::Rc;
fn main()
{
    let foo: Rc<i32> = Rc::new(3);
    let mut foo_cloned = Rc::clone(&foo);
    let mut foo_unwrapped = Rc::get_mut(&mut foo_cloned).unwrap();  
    foo_unwrapped = &mut 42;
}

【问题讨论】:

  • 我说我强烈反对它,而不是我反对它;)但我明白你的观点。在我看来,文档清楚地说明了它何时返回None 以及何时返回Some(_),所以我问自己一个问题,您是否首先阅读了该文档(您说是)。所以你的标题问,为什么它会恐慌 -> 因为unwrap。为什么有一个None 值 -> 文档说明了它,因为您有多个 Rc 指向相同的值。

标签: rust reference-counting panic


【解决方案1】:

来自the Rc docs(强调我的)

pub fn get_mut(this: &mut Rc<T>) -> Option<&mut T>

如果没有其他 RcWeak 指向同一分配的指针,则返回对给定 Rc 的可变引用。

否则返回None,因为改变共享值是不安全的。

另见make_mut,当有其他指针时,它将克隆内部值。

您有两个Rc 指针指向相同的数据(即foofoo_cloned),因此获取对数据的可变引用是不安全的。

Rc 并不是摆脱 Rust 借用语义的魔术。 Rust 仍然是一种单一所有权语言,并且仍然强制执行所有相同的保护;只是在Rc 的情况下,执行发生在运行时而不是编译时。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-26
    • 2019-05-10
    • 2015-12-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多