std::rc::Weak<T>有以下定义:
pub struct Weak<T: ?Sized> {
ptr: NonNull<RcBox<T>>,
}
Run Code Online (Sandbox Code Playgroud)
根据我的理解,当没有剩下的时候Rc<T>,RcBox<T>将被释放,Weak<T>.ptr现在指向一个可能包含任何东西的地方。那么当在upgrade()a 上调用时Weak<T>,它如何知道指针现在无效?
Weak<T>::upgrade有以下实现:
pub fn upgrade(&self) -> Option<Rc<T>> {
let inner = self.inner()?;
if inner.strong() == 0 {
None
} else {
unsafe {
inner.inc_strong();
Some(Rc::from_inner(self.ptr))
}
}
}
Run Code Online (Sandbox Code Playgroud)
这是否意味着当野外RcBox<T>没有剩余的时候就没有真正获得自由?Rc<T>如果是的话,那不是会泄漏内存吗?
memory-management weak-references smart-pointers reference-counting rust