You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Rust中为何drop(&RefMut)无法终止RefCell的可变借用?

RefCell中RefMut引用的Drop问题解析

核心问题解答

  1. 调用drop(&RefMut)时发生了什么?
    调用drop(&RefMut)只会销毁RefMut的引用(&RefMut<T>),完全不会触及RefMut实例本身。drop函数接收的是传入值的所有权,这里你传的是引用,所以仅会销毁这个引用,不会触发RefMut的Drop逻辑(也就是不会释放RefCell的可变借用锁)。

  2. 为什么RefMut不会被销毁?
    你的代码里let b = &c.borrow_mut();这一行中,c.borrow_mut()返回的是临时的RefMut<Data>实例。由于你取了这个临时实例的引用并绑定给b,Rust会自动延长临时实例的生命周期,使其和b的生命周期一致(直到main函数执行完毕)。你没有持有这个RefMut实例的所有权,自然无法通过销毁引用来销毁它。

  3. 被引用的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.23 01:32:22