Rust中为何drop(&RefMut)无法终止RefCell的可变借用?
RefCell中RefMut引用的Drop问题解析
核心问题解答
调用
drop(&RefMut)时发生了什么?
调用drop(&RefMut)只会销毁RefMut的引用(&RefMut<T>),完全不会触及RefMut实例本身。drop函数接收的是传入值的所有权,这里你传的是引用,所以仅会销毁这个引用,不会触发RefMut的Drop逻辑(也就是不会释放RefCell的可变借用锁)。为什么RefMut不会被销毁?
你的代码里let b = &c.borrow_mut();这一行中,c.borrow_mut()返回的是临时的RefMut<Data>实例。由于你取了这个临时实例的引用并绑定给b,Rust会自动延长临时实例的生命周期,使其和b的生命周期一致(直到main函数执行完毕)。你没有持有这个RefMut实例的所有权,自然无法通过销毁引用来销毁它。被引用的RefMut何时会被销毁?
这个临时RefMut实例会在当前作用域结束时(也就是main函数执行到末尾时)自动销毁,此时才会触发它的Drop trait实现,释放RefCell的可变借用锁。
代码问题分析
你代码报错的根本原因是:临时RefMut实例一直存活到main结束,导致后续调用c.borrow_mut()时,RefCell仍处于可变借用状态,触发BorrowMutError panic。
如果想要手动提前释放借用,应该直接持有RefMut的所有权而非引用:
use std::cell::RefCell; struct Data { pub x: usize, } fn main() { let c = RefCell::new(Data { x: 42 }); let b = c.borrow_mut(); // 持有RefMut的所有权 drop(b); // 销毁RefMut实例,触发Drop释放借用 let mut d = c.borrow_mut(); d.x = 43; println!("Hello, world!"); // 正常运行 }
内容的提问来源于stack exchange,提问作者hnyls2002
相关产品推荐
相关产品推荐

