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

Rust中如何为Vec添加无借用字符串值?生命周期问题求助

问题分析与解决

我原本以为clone()会对字符串进行深度复制,通过as_str()获取的&str应该是独立的值,不与任何变量关联,但实际运行却出现了生命周期相关错误。

代码示例

fn main() {
    let mut keep_vec: Vec<&str> = vec![];

    let new_string = "New String".to_string();

    // 在代码块内创建新字符串并推入keep_vec
    {
        let second_string = "Second String".to_string();

        /* 最初直接使用相关代码时触发错误:
        temporary value dropped while borrowed E0716 
        创建的临时值在仍被使用时被释放 提示: 考虑用`let`绑定创建生命周期更长的值
         */
        
        let string_clone = second_string.clone();

        /* 现在触发的错误:
        `string_clone` does not live long enough E0597 
        被借用的值生命周期不足
         */
        
        keep_vec.push(string_clone.as_str());
        
    }

    keep_vec.push(&*new_string);
}

报错说明

  • 第一次错误:临时值在借用时被释放(E0716)
  • 第二次错误:string_clone生命周期不足(E0597)

原因解析

  1. E0716错误原因:如果直接写keep_vec.push(second_string.clone().as_str()),clone()返回的是一个临时String,as_str()获取的引用绑定到这个临时对象。但临时对象会在当前语句执行完毕后立即被销毁,导致keep_vec中的引用指向已释放的内存,Rust的借用检查器会阻止这种不安全行为。
  2. E0597错误原因:string_clone确实是second_string的深度复制,但它的生命周期仅限于内部代码块。当代码块结束时,string_clone被销毁,as_str()返回的引用也就失去了有效的指向对象,而keep_vec的生命周期比代码块长,所以引用无法存活到代码块之外。

解决方案

要解决这个问题,有两种常见思路:

  • 思路一:让字符串生命周期与keep_vec一致:把string_clone的声明移到代码块外部,确保它的生命周期覆盖keep_vec的使用周期,但这种方式会打破原本的作用域设计。
  • 思路二:修改keep_vec的类型为Vec<String>:直接存储字符串对象而非引用,彻底规避生命周期问题。修改后的代码如下:
fn main() {
    let mut keep_vec: Vec<String> = vec![];

    let new_string = "New String".to_string();

    {
        let second_string = "Second String".to_string();
        let string_clone = second_string.clone();
        keep_vec.push(string_clone);
    }

    keep_vec.push(new_string);
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.21 08:03:33