提问人:Calogyne 提问时间:5/5/2023 最后编辑:Solomon UckoCalogyne 更新时间:5/8/2023 访问量:229
在 Rust 中,Weak<T> 如何知道内部值何时被删除?
In Rust, how does Weak<T> know when the inner value has been dropped?
问:
std::rc::Weak<T>
具有以下定义:
pub struct Weak<T: ?Sized> {
ptr: NonNull<RcBox<T>>,
}
在我的理解中,当没有更多的东西时,将被释放,现在指向一个可能包含任何东西的地方。那么当被调用时,它怎么知道指针现在是无效的呢?Rc<T>
RcBox<T>
Weak<T>.ptr
upgrade()
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))
}
}
}
这是否意味着当野外没有剩下的东西时,它们并没有真正被释放?如果是这样,那不会泄漏内存吗?RcBox<T>
Rc<T>
答:
11赞
cdhowie
5/5/2023
#1
在没有强指针或弱指针剩余之前,不会销毁。RcBox
但是,当强计数达到零时,包含的内容将保留到位。这有效地破坏了包含的内容,但不会释放其本身的记忆。这就是如何知道内部值是否被删除 -- 如果您尝试在强计数为零时将 a 升级为 an,则操作将失败并返回 。T
T
T
Weak
Weak
Rc
None
一旦弱计数也达到零,它本身就会被释放。所以不,没有内存泄漏。RcBox
请注意,许多类型(如 和 )管理单独的堆分配。例如,如果强计数达到零,但弱计数未达到零,则内部的删除代码将运行并删除其所有拥有的元素,并释放用于存储它们的堆分配。本身用于保存堆指针、长度和容量的内存不会被释放,因为它归 .只有当强计数和弱计数都达到零时,该分配才会被释放。String
Vec
Rc<Vec<_>>
Vec
Vec
RcBox
评论
2赞
Chayim Friedman
5/5/2023
这就是使循环成为可能的方式,因为 的下降将导致 下降。Weak
Rc
Weak
评论