std::rc::Weak<T>
的定义如下:
pub struct Weak<T: ?Sized> {
ptr: NonNull<RcBox<T>>,
}
在我的理解中,当没有剩余的
Rc<T>
时,RcBox<T>
将被释放,Weak<T>.ptr
现在指向一个可能包含任何内容的位置。因此,当在Weak<T>
上调用upgrade()
时,它如何知道指针现在无效?
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))
}
}
}
这是不是意味着当野指针中没有 Rc<T>
剩余时,RcBox<T>
实际上并没有被释放?如果是的话,那不会造成内存泄漏吗?
Weak
如何使循环引用成为可能,因为Rc
的释放将导致Weak
也被释放。 - Chayim Friedman