是否存在包含单个强主人和多个弱引用的共享指针?

时间:2018-06-07 23:52:34

标签: rust smart-pointers

我正在寻找类似于Arc / Rc的智能指针,只是它不允许共享所有权。

我希望尽可能多地提供rc::Weak个引用,但我只想要一个强引用,a.k.a所有者。我想用类型系统强制执行。

Arc / Rc可以克隆,并且可以在多个地方拥有。

滚动我自己的智能指针是一种选择,但我相信这样的数据结构应该已经存在,即使在标准库之外也是如此。

我正在寻找提供这种界面的数据结构:

impl MySmartPointer<T> {
    fn new(object: T) -> Self;
    fn weak_ref(&self) -> WeakRef<T>;
    fn get_mut(&mut self) -> &mut T;
}

impl WeakRef<T> {
    /// If the strong pointer `MySmartPointer` has been dropped,
    /// return `None`. Else return Some(&T);
    fn get(&self) -> Option<&T>;
}

1 个答案:

答案 0 :(得分:4)

我们假设它存在Strong<T>Weak<T>类型。你如何使用Weak<T>?你需要某种易犯错误的升级&#34;步骤,那么Weak<T>升级到什么?它可以是一个简单的参考(正如您所说),因为Strong<T> 需要来了解是否有任何&#34;升级&#34; Weak<T>存在。如果它没有,它可以在仍然访问该值时释放其存储空间。

所以Weak<T>必须升级到某种SemiWeak<T>才能使基础分配保持活跃状态​​......这正是共享所有权 的原因。

如果您以某种方式保证Strong<T>在所有Weak<T>消失之前无法取消分配,该怎么办?恭喜,您刚刚重新发明了T&T:您可以直接使用它们。

好吧,所以如果你做了什么,以便Weak<T>升级到与SemiWeak<'a, T>的生命周期相关的Weak<T>,以便它< em>不能超过它,而且只能是暂时的吗?在这种情况下你真正做的就是隐藏你已经拥有共享所有权的事实。在幕后,SemiWeak仍然需要保证潜在的Strong无法消失。您可以在大约10分钟内从Rc<T>轻松构建这样的类型。这将有效地为您提供一个类似于Rc<T>的类型,具有相同的性能和内存成本,但不太有用。

此外,get_mut方法不存在。没有办法阻止SemiWeak<T>存在。除非您使用借用,但再次使用T&T

所以,不,我不认为这存在,我也不相信可以以您所描述的形式存在。

最后一点,只是让Weak<T> 完全是一种共享所有权形式,因为那些Weak<T>需要指向 >。在Rc<T>的情况下,弱计数器与强计数器一起存储,因此虽然可以销毁该值,但分配本身仍然存在。您可以拆分这两个,但现在您需要支付两个分配双重间接(可能导致更多缓存未命中)。