Rust借用检查器与指针交互的行为及安全性疑问
Unsafe Rust中指针转引用的借用检查器行为分析
借用检查器的角色变化:借用检查器仅在安全Rust代码中自动执行内存安全规则。当你通过
unsafe块从裸指针生成引用时,借用检查器会完全信任你手动维护内存安全——它不会再对这部分代码做自动校验,所有规则遵守的责任都落在你身上。引用
drop的实际行为:你的猜测正确,drop(a)和drop(b)不会产生任何特殊效果。引用只是对内存地址的只读视图,不拥有底层数据的所有权,调用drop不会释放内存,也不会改变指针或数据的有效性。你的代码的风险与安全性:
- 内存泄漏:这段代码存在明确的内存泄漏问题。
Box::into_raw将Box的所有权转换为裸指针,但后续没有通过Box::from_raw(ptr)回收内存,底层的value会永远留在堆上无法释放。 - 未定义行为(UB):当前代码中生成两个不可变引用
a和b,这符合Rust的“多个不可变引用共存”规则,因此不会触发UB。但如果手动生成冲突的引用(比如同时存在可变引用与不可变引用、多个可变引用),就会直接导致UB,而借用检查器不会对此进行拦截。
- 内存泄漏:这段代码存在明确的内存泄漏问题。
修复内存泄漏的方法:在使用完裸指针后,必须调用
unsafe { Box::from_raw(ptr); },将裸指针重新转换为Box,这样Box会在作用域结束时自动释放底层内存,避免泄漏。
内容的提问来源于stack exchange,提问作者DerFrederikHD
相关产品推荐
相关产品推荐

