如何解决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
相关产品推荐
相关产品推荐

