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

我想拥有尽可能多的rc::Weak引用,但我只希望一个强引用,又称所有者。我想使用类型系统来强制执行。

可以克隆Arc/Rc,并且可以在多个位置拥有它们。

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

我正在寻找提供这种接口(interface)的数据结构:

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>;
}

最佳答案

假设它存在类型Strong<T>Weak<T>。您如何使用Weak<T>?您需要某种容易犯错的“升级”步骤,那么Weak<T>升级到什么呢?它不能是普通的引用(如您所述),因为Strong<T> 需要才能知道是否存在任何“升级的” Weak<T>。如果没有,它可以在仍然访问该值的同时释放其存储空间。

因此,Weak<T>必须升级到某种SemiWeak<T>,以使基础分配保持 Activity 状态……这恰恰是共享所有权。

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

好的,如果您这样做了,那么Weak<T>升级为与SemiWeak<'a, T>的生存期相关联的Weak<T>,以致于它不能超过它,并且只能是临时的,该怎么办?在这种情况下,您真正​​要做的就是隐藏您拥有共享所有权的事实。在幕后,SemiWeak仍然需要保证基础Strong不会消失。您可以在十分钟之内从Rc<T>轻松构建这样的类型。这将有效地为您提供一种与Rc<T>完全一样的类型,并且具有相同的性能和内存成本,但用处较小。

另外,该get_mut方法不存在。无法阻止SemiWeak<T>的存在。除非您使用借用,但是再次使用T&T

因此,不,我认为这不存在,也不会以您描述的形式存在。

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

关于rust - 是否存在具有单个强所有者和多个弱引用的共享指针?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/50751606/

10-11 15:48