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

为什么Rust会出现临时值被借用时释放的问题?对应所有权问题是什么?

Rust E0716 报错原因及所有权问题解析

报错核心原因

你的代码触发E0716的本质是产生了悬垂引用,违反了Rust的借用规则:引用的生命周期不能长于被引用的对象。

具体到你的代码逻辑:

  1. 你声明的mod_string初始值是"",类型为&'static str,是一个字符串切片引用。
  2. 第9行的拼接表达式mod_string.to_owned() + &x.to_string() + ","的计算结果是一个临时的String类型值,这个值没有被任何let变量绑定持有。
  3. Rust中未被绑定的临时值生命周期仅到当前语句结束,执行完这条赋值语句后,这个临时的拼接结果会被立即销毁。
  4. 你用&取了这个临时值的引用赋值给mod_string,就导致mod_string变成了指向已经被销毁内存的悬垂引用,后续第13行调用mod_string.to_string()时要访问这个已经失效的引用,自然会被编译器拦截报错。

对应的所有权规则说明

这里涉及两条Rust核心所有权/借用规则:

  • 每个值同一时间只能有一个所有者,当所有者离开作用域/语句结束(针对临时值),值会被自动清理
  • 任何引用的生命周期都不能超过它指向的值的生命周期

你的代码中临时拼接的String值在语句结束就被清理,而你持有它的引用还后续使用,完全违反了上面的第二条规则。

修复方案

最简单的修复是直接让mod_string持有String所有权而不是用引用,避免临时值问题:

fn test_code() -> String {
    // 初始化为空String,直接持有所有权
    let mut mod_string = String::new();

    let y = ["", "", " "];

    for x in &y {
        if x == &" " {
            // 直接拼接,不需要取引用,mod_string会持有拼接后的结果
            mod_string = mod_string + x + ",";
        }
    }

    mod_string
}

也可以用更高效的push_str方法避免不必要的内存分配:

if x == &" " {
    mod_string.push_str(x);
    mod_string.push(',');
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.21 21:24:07