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

如何解决Rust中‘borrowed value does not live long enough’错误?

解决Rust中“borrowed value does not live long enough”错误

错误原因

你代码里的tmp是循环迭代内的局部String变量,每次循环结束后tmp就会被销毁。但你把tmp的引用&str存入了生命周期更长的saved_message向量,这导致引用指向了已被释放的内存,违反了Rust的借用安全规则,因此编译器报错。

解决方案

方案1:存储String而非&str(推荐)

直接将String存入向量,让向量管理字符串的所有权,从根本上避免引用失效问题:

fn main() {
    let mut saved_message: Vec<String> = Vec::new();
    for i in 0..10 {
        let mut tmp: String = String::from("line_num ");
        tmp.push_str(&i.to_string());
        saved_message.push(tmp); // 转移tmp的所有权到向量,无需引用
    }
}

也可以用format!宏简化字符串生成逻辑:

fn main() {
    let mut saved_message: Vec<String> = Vec::new();
    for i in 0..10 {
        saved_message.push(format!("line_num {}", i));
    }
}

方案2:延长字符串生命周期(仅特殊场景适用)

如果必须使用引用类型,需要确保字符串的生命周期覆盖saved_message。比如将字符串分配到堆上并转为&'static str(注意:这种方法会导致内存无法自动释放,仅在特殊需求下使用):

fn main() {
    let mut saved_message: Vec<&'static str> = Vec::new();
    for i in 0..10 {
        let tmp = format!("line_num {}", i);
        // 将String转为Box<str>并泄漏内存,使其生命周期变为'static
        let static_str: &'static str = Box::leak(tmp.into_boxed_str());
        saved_message.push(static_str);
    }
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 13:15:32