小编Cal*_*yne的帖子

在 Rust 中,Weak<T> 如何知道内部值何时被删除?

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

7
推荐指数
1
解决办法
358
查看次数