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

Rust中&mut Foo与*mut Foo的区别及*mut Foo含义解析

*mut T 和 &mut T 的核心区别

首先明确:*mut Foo是Rust中的原始可变指针,它和安全的可变引用&mut Foo有本质区别,具体差异如下:

1. 安全约束完全不同

  • &mut Foo是Rust的安全可变引用,严格遵循借用规则:同一时间只能存在一个可变引用,或者多个不可变引用;且引用必须始终指向有效内存,不会出现悬空。这些规则由编译器在编译期强制检查,从根源上避免内存安全问题。
  • *mut Foo是原始指针,完全绕过Rust的借用检查系统。你可以同时创建多个指向同一内存的*mut Foo,甚至让它指向已释放的内存——编译器不会阻止这些操作,但所有对*mut Foo的解引用或转换都必须放在unsafe块中,内存安全完全由开发者自己负责。

2. 转换与适用场景有别

  • 安全引用可以隐式转换为原始指针(就像你示例里&mut String转*mut String的代码),因为原始指针是更宽松的类型;但反过来,*mut Foo转&mut Foo必须在unsafe块中完成,而且你必须手动保证:指针指向的内存有效、当前没有其他可变引用或指针在操作这块内存,否则会触发未定义行为。
  • &mut Foo用于Rust常规安全代码,在保证内存安全的前提下实现可变访问;*mut Foo主要用于FFI交互(比如你调用的C语言函数),或者需要手动管理内存的底层场景(比如自定义高性能数据结构)。

3. 有效性保证不同

  • &mut Foo永远不可能是空指针,也永远指向有效的、未释放的内存,这是编译器通过借用规则保证的。
  • *mut Foo可以是空指针,也可以指向无效内存(比如已释放的堆内存),这些都是合法的声明,但操作这类指针时必须额外校验有效性,否则解引用会直接导致程序崩溃或未定义行为。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.23 09:33:12