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

Rust借用检查器与指针交互的行为及安全性疑问

Unsafe Rust中指针转引用的借用检查器行为分析
  • 借用检查器的角色变化:借用检查器仅在安全Rust代码中自动执行内存安全规则。当你通过unsafe块从裸指针生成引用时,借用检查器会完全信任你手动维护内存安全——它不会再对这部分代码做自动校验,所有规则遵守的责任都落在你身上。

  • 引用drop的实际行为:你的猜测正确,drop(a)和drop(b)不会产生任何特殊效果。引用只是对内存地址的只读视图,不拥有底层数据的所有权,调用drop不会释放内存,也不会改变指针或数据的有效性。

  • 你的代码的风险与安全性:

    1. 内存泄漏:这段代码存在明确的内存泄漏问题。Box::into_raw将Box的所有权转换为裸指针,但后续没有通过Box::from_raw(ptr)回收内存,底层的value会永远留在堆上无法释放。
    2. 未定义行为(UB):当前代码中生成两个不可变引用a和b,这符合Rust的“多个不可变引用共存”规则,因此不会触发UB。但如果手动生成冲突的引用(比如同时存在可变引用与不可变引用、多个可变引用),就会直接导致UB,而借用检查器不会对此进行拦截。
  • 修复内存泄漏的方法:在使用完裸指针后,必须调用unsafe { Box::from_raw(ptr); },将裸指针重新转换为Box,这样Box会在作用域结束时自动释放底层内存,避免泄漏。

内容的提问来源于stack exchange,提问作者DerFrederikHD

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.23 17:22:33