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

2023-09-04 02:14:32 作者:偷吃仙果

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

我希望拥有所需数量的rc::Weak引用,但我只需要一个强引用,即所有者。我想用类型系统来强制执行这一点。

关于c 中的异常机制以及智能指针

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不会消失。您可以在大约10分钟内从Rc<T>简单地构建这样一个类型。这将有效地为您提供一个与Rc<T>完全相同的类型,具有相同的性能和内存成本,但用处较小。

此外,get_mut方法不存在。无法阻止SemiWeak<T>存在。除非您使用借用,但也只是使用T&T

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

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