我正在寻找类似于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/