为什么Rust会出现临时值被借用时释放的问题?对应所有权问题是什么?
Rust E0716 报错原因及所有权问题解析
报错核心原因
你的代码触发E0716的本质是产生了悬垂引用,违反了Rust的借用规则:引用的生命周期不能长于被引用的对象。
具体到你的代码逻辑:
- 你声明的
mod_string初始值是"",类型为&'static str,是一个字符串切片引用。 - 第9行的拼接表达式
mod_string.to_owned() + &x.to_string() + ","的计算结果是一个临时的String类型值,这个值没有被任何let变量绑定持有。 - Rust中未被绑定的临时值生命周期仅到当前语句结束,执行完这条赋值语句后,这个临时的拼接结果会被立即销毁。
- 你用
&取了这个临时值的引用赋值给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
相关产品推荐
相关产品推荐

