Rust中borrowed value does not live long enough报错求助
问题分析
错误的核心原因是悬空引用:
temp是通过format!生成的临时String,它的生命周期仅限当前循环迭代,循环结束后会被Rust自动销毁。rbe3_concat是Vec<&str>,其中所有引用都指向temp的内存空间。当你将rbe3_concat的克隆存入RBE3后,这些引用会在temp销毁后变成无效的悬空引用,Rust的所有权系统会直接阻止这种不安全行为,抛出E0597错误。
解决方案
最直接的修复方式是使用拥有所有权的类型替代引用,把存储&str的容器改成存储String,这样每个元素都拥有自己的数据,不再依赖临时变量的生命周期。
修改后的代码如下:
use std::fs::File; use std::io::{BufRead, BufReader}; fn main() { if let Ok(file) = File::open("file.bdf") { let reader = BufReader::new(file); let satirlar: Vec<String> = reader.lines().map(|line| line.unwrap()).collect(); // 将所有Vec<Vec<&str>>替换为Vec<Vec<String>> let mut GRIDS: Vec<Vec<String>> = Vec::new(); let mut CQUAD4: Vec<Vec<String>> = Vec::new(); let mut CBAR: Vec<Vec<String>> = Vec::new(); let mut RBE3: Vec<Vec<String>> = Vec::new(); for (index, satir) in satirlar.iter().enumerate() { // 将分割后的&str转换为String存储 let a: Vec<String> = satir.split_whitespace().map(|s| s.to_string()).collect(); // 先判断是否为最后一行,避免index+1越界触发panic if a[0] == "GRID" { GRIDS.push(a); } else if a[0] == "CQUAD4" { CQUAD4.push(a); } else if a[0] == "CBAR" { CBAR.push(a); } else if a[0] == "RBE3" && index < satirlar.len() - 1 { // 仅在遇到RBE3且非最后一行时执行拼接逻辑 let temp = format!("{} {}", satir, &satirlar[index + 1]); // 将分割结果转为String存入容器 let rbe3_concat: Vec<String> = temp.split_whitespace().map(|s| s.to_string()).collect(); RBE3.push(rbe3_concat); } } } }
额外注意点
- 原代码未处理
index + 1越界的情况,若文件最后一行是RBE3会直接触发panic,修改后的代码添加了index < satirlar.len() - 1的判断规避该问题。 - 统一将所有容器改为
Vec<Vec<String>>后,GRIDS、CQUAD4等也不会再遇到类似生命周期问题,代码整体健壮性更强。
内容的提问来源于stack exchange,提问作者ramailm
相关产品推荐
相关产品推荐

