是否存在具有单个强所有者和多个弱引用的共享指针?



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

我想根据需要拥有尽可能多的rc::Weak引用,但我只想要一个强大的引用,也就是所有者。我想用类型系统来强制执行这一点。

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

假设它存在于类型Strong<T>Weak<T>中。 你如何使用Weak<T>? 您需要某种容易出错的"升级"步骤,那么Weak<T>升级到什么? 它不可能是普通的引用(如您所说(,因为Strong<T>需要知道是否存在任何"升级"Weak<T>。 如果没有,它可以在值仍在访问时解除分配其存储。

因此,Weak<T>必须升级到某种SemiWeak<T>,以保持底层分配的活力......这正是共享所有权。

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

好吧,那么,如果您将其Weak<T>升级到与Weak<T>寿命相关的SemiWeak<'a, T>,使其无法超过它,而只能是暂时的呢?在这种情况下,你真正要做的只是隐藏你拥有共享所有权的事实。 在引擎盖下,SemiWeak仍然需要保证底层Strong不会消失。 您可以在十分钟内轻松地从Rc<T>构建这样的类型。 这将有效地为您提供一种与Rc<T>完全相同的类型,具有相同的性能和内存成本,但不太有用。

此外,该get_mut方法不存在。 没有办法阻止SemiWeak<T>的存在。 除非您使用借用,但同样,这只是使用T&T

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


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

最新更新