Rust所有权智能指针

5
我最近开始学习Rust,并了解了智能指针(Box、Rc 和 RefCell)。
在指南中,他们谈到了Rc实现“共享所有权”,但如果我理解正确,所有权系统的整个重点就是只能有一个所有者。
对于我这样的Rust新手来说,似乎Rc和RefCell采用它们包含的值的所有权并只是“公开”所包含值的不同类型的引用?
我错了吗? 如果是,为什么Rust被允许这样“欺骗”所有权系统?理论上,我是否能够实现自己的“欺骗”类型?

1
他们在底层使用了不安全的方法。就是这样。 - user1937198
有些东西如果没有这些“作弊”,你就无法编程。但是它们经过测试并且可靠,所以它们的“作弊”本质不会引起太多麻烦。一般来说,Rust 不会禁止你通过 unsafe 打破正常规则来制作快速和方便的工具。但是除非你确定它们没有漏洞,否则你应该非常小心。 - Alexey Larionov
2
所有权系统不会被“Rc”和“RefCell”欺骗,因为它们提供与普通类型相同的保证。您仍然无法同时获得超过一个可变引用,并且如果对同一值的可变引用处于活动状态,则仍然无法获得共享引用。使用这些类型,在安全的 Rust 中,您将无法遇到未定义的行为(内存损坏、未受控制的崩溃或错误编译)。唯一的区别是它们将检查从编译时移动到运行时,从而使本应无法访问的共享所有权习语的安全访问成为可能。 - user4815162342
1个回答

5
如果我理解正确,所有权系统的整个重点是只能有一个所有者。
不是的。Rust 保证不能有多个可变引用,并且不能同时存在可变和非可变借用。它关于所有者没有说什么。
为什么 Rust 可以“欺骗”所有权系统?
不可以。
我理论上能实现自己的“欺骗”类型吗?
可以。这些类型都在 Rust 中实现¹。这些类型经过了实战测试,并在 Rust 的安全规则下完全安全,但它们在更低的级别需要使用 unsafe
请注意,unsafe 不允许绕过规则,即您可以拥有一个可变引用 XOR 任意数量的非可变引用,但使用 unsafe,您仍然可以这样做。当然,这实际上是不安全的(并会触发未定义行为)。
1:虽然其中一些类型使用编译器仍然私有的功能实现,因此您将无法像标准库一样以相同的效率执行所有操作,而 BoxUnsafeCell 是语言中特殊的类型,不能由普通库再现。例如,有许多创建提供 RcArc 替代品的板条箱,在某些情况下它们比标准库更好。

它确实说“一次只能有一个所有者。” - polortiz40

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接