我正在寻找类似于Arc
/ Rc
的智能指针,只是它不允许共享所有权。
我希望尽可能多地提供rc::Weak
个引用,但我只想要一个强引用,a.k.a所有者。我想用类型系统强制执行。
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>;
}
答案 0 :(得分:4)
我们假设它存在Strong<T>
和Weak<T>
类型。你如何使用Weak<T>
?你需要某种易犯错误的升级&#34;步骤,那么Weak<T>
升级到什么?它可以是一个简单的参考(正如您所说),因为Strong<T>
需要来了解是否有任何&#34;升级&#34; Weak<T>
存在。如果它没有,它可以在仍然访问该值时释放其存储空间。
所以Weak<T>
必须升级到某种SemiWeak<T>
才能使基础分配保持活跃状态......这正是共享所有权 的原因。
如果您以某种方式保证Strong<T>
在所有Weak<T>
消失之前无法取消分配,该怎么办?恭喜,您刚刚重新发明了T
和&T
:您可以直接使用它们。
好吧,所以如果你做了什么,以便Weak<T>
升级到与SemiWeak<'a, T>
的生命周期相关的Weak<T>
,以便它< em>不能超过它,而且只能是暂时的吗?在这种情况下你真正做的就是隐藏你已经拥有共享所有权的事实。在幕后,SemiWeak
仍然需要保证潜在的Strong
无法消失。您可以在大约10分钟内从Rc<T>
轻松构建这样的类型。这将有效地为您提供一个类似于Rc<T>
的类型,具有相同的性能和内存成本,但不太有用。
此外,get_mut
方法不存在。没有办法阻止SemiWeak<T>
存在。除非您使用借用,但再次使用T
和&T
。
所以,不,我不认为这存在,我也不相信可以以您所描述的形式存在。
最后一点,只是让Weak<T>
完全是一种共享所有权形式,因为那些Weak<T>
的需要指向 >。在Rc<T>
的情况下,弱计数器与强计数器一起存储,因此虽然可以销毁该值,但分配本身仍然存在。您可以拆分这两个,但现在您需要支付两个分配和双重间接(可能导致更多缓存未命中)。