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

Rust中替换可变引用内的String会导致内存泄漏吗?

Rust字符串赋值的内存安全与drop机制问题

问题场景

fn compute_values(value: &mut String) {
    // 首次计算应始终成功:
    let computed_value = String::from("computed value");
    // 用计算值覆盖默认String:
    *value = computed_value;
    // 更多返回Result类型值或错误信息的代码
}

fn main() {
    let mut value = String::from("default value");
    compute_values(&mut value);
    println!("value: {value}")
}

上述代码可正常编译运行,但存在以下疑问:

  • 猜测*value = computed_value;会覆盖原String的字段,但原堆内存可能无法释放,是否存在内存泄漏?
  • 非unsafe Rust替换可变引用的值时是否能保证内存安全?
  • 有没有关于解引用赋值的官方文档?

注:即使value是从标准输入读取的堆分配字符串,场景逻辑一致。

解答

  1. 是否存在内存泄漏?
    完全没有内存泄漏。执行*value = computed_value;时,Rust会先调用原*value(即"default value"对应的String实例)的drop方法,自动释放它指向的堆内存,再将computed_value的内部数据(指针、长度、容量)移动到*value的内存位置中。原String的堆资源会被正确回收,不会出现泄漏。

  2. 非unsafe Rust替换可变引用的值是否保证内存安全?
    是的。内存安全是Rust的核心承诺之一,所有非unsafe代码都不会出现内存泄漏、野指针、数据竞争等内存不安全问题。替换可变引用的值属于安全Rust的范畴,编译器会自动处理资源的释放逻辑,确保所有不再被使用的资源都能被正确清理。

  3. 是否有解引用赋值的官方文档?
    关于赋值操作的语义(包括解引用后的赋值),可以参考Rust参考手册中的赋值表达式章节,其中明确说明:当给已初始化的变量(或解引用后的可变目标)赋值时,会先丢弃旧值,再将新值移动到目标位置。另外你提到的Rustonomicon中也有关于drop机制和赋值细节的说明,比如未初始化变量的drop条件等。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.03 14:33:18