我正在寻找类似于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>
的情况下,弱计数器与强计数器一起存储,因此虽然值可以被破坏,但分配本身仍然存在。 您可以将两者分开,但现在您需要为两次分配和双重间接寻址付费(可能会导致更多的缓存未命中(。