error[E0597]: `x` does not live long enough
error: borrowed value does not live long enough
A reference outlives the data it points to. Rust’s borrow checker prevents dangling references.
Fix 1: Return Owned Data Instead of Reference
// ❌ Returning reference to local variable
fn get_name() -> &str {
let name = String::from("Alice");
&name // 💥 name is dropped at end of function
}
// ✅ Return owned String
fn get_name() -> String {
String::from("Alice")
}
Fix 2: Extend the Lifetime
// ❌ Temporary dropped too soon
let r;
{
let x = 5;
r = &x; // 💥 x dropped here
}
println!("{}", r);
// ✅ Move x to outer scope
let x = 5;
let r = &x;
println!("{}", r);
Fix 3: Use Clone
// ❌ Borrowing from a temporary
let first = vec!["a", "b", "c"].first(); // 💥 Vec is temporary
// ✅ Clone the data
let items = vec!["a", "b", "c"];
let first = items.first();
Fix 4: Lifetime Annotations in Structs
// ❌ Struct holds reference but no lifetime
struct Config {
name: &str, // 💥 Missing lifetime
}
// ✅ Add lifetime annotation
struct Config<'a> {
name: &'a str,
}
Fix 5: Use String Instead of &str in Structs
// ✅ Owned data — no lifetime needed
struct Config {
name: String, // Owns the data
}
This is often the simplest fix. Use owned types (String, Vec<T>) in structs unless you have a specific reason to borrow.
Related resources
Related: Cargo Cheat Sheet