Rust: Lifetimes and “Temporary Value Dropped While Borrowed”
Using lifetimes to resolve the E0716 error: “temporary value dropped while borrowed.”
![]() |
---|
Rust: Lifetimes and “Temporary Value Dropped While Borrowed” |
Easing myself back into Rust after taking a break from it for over a year. I revisited a Stack Overflow question that I had also looked at on 28/02/2024.
❶ Rust version 1.86.0 (05f9846f8 2025-03-31)
still produces the same compilation error as described in the original post, which is:
error[E0716]: temporary value dropped while borrowed --> ./src/std_019_dropped_borrowed.rs:10:19 | 9 | fn fun1(s1: &String, v1: &mut Vec1) { | -- has type `&mut Vec<&'1 String>` 10 | v1.insert(0, &s1.clone()); | --------------^^^^^^^^^^-- temporary value is freed at the end of this statement | | | | | creates a temporary value which is freed while still in use | argument requires that borrow lasts for `'1` error: aborting due to 1 previous error For more information about this error, try `rustc --explain E0716`.
And the original code is:
type Vec1<'a> = Vec::<&'a String>; fn fun1(s1: &String, v1: &mut Vec1) { v1.insert(0, &s1.clone()); } fn main() { let mut vec1 = Vec::new(); let str1 = String::new(); fun1(&str1, &mut vec1); }
❷ My First Attempt at Getting the Code to Compile:
type Vec1<'a> = Vec::<&'a String>; fn fun1<'a>(s1: &'a String, v1: &'a mut Vec1) { v1.insert(0, s1); } fn main() { let mut vec1 = Vec1::new(); let str1 = String::from("abcdd"); fun1(&str1, &mut vec1); println!("{:?}", vec1); }
The following changes were made:
-
Added the lifetime
'a
tofun1(...)
asfn fun1<'a>(s1: &'a String, v1: &'a mut Vec1)
. The lifetime ensures that the string references1
remains valid as long as the reference to the vectorvec1
is alive. -
Updated the function body to use
v1.insert(0, s1);
. Since the entries in the vectorvec1
are string references, ands1
is a string reference, it can be directly inserted into the vector. -
For testing purposes, assigned an actual value to
str1
infn main()
:let str1 = String::from("abcdd");
.
This refactoring results in a new error:
error[E0621]: explicit lifetime required in the type of `v1` --> ./src/std_019_dropped_borrowed.rs:24:5 | 23 | fn fun1<'a>(s1: &'a String, v1: &'a mut Vec1) { | ------------ help: add explicit lifetime `'a` to the type of `v1`: `&'a mut Vec<&'a String>` 24 | v1.insert(0, s1); | ^^^^^^^^^^^^^^^^ lifetime `'a` required error: aborting due to 1 previous error For more information about this error, try `rustc --explain E0621`. behai@HP-Pavilion-15:~/rust/std$
The error is also shown in its original format in the screenshot below:
❸ The lifetime annotation for fun1(...)
should be written as
fn fun1<'a>(s1: &'a String, v1: &mut Vec1<'a>)
(instead of
fn fun1<'a>(s1: &'a String, v1: &'a mut Vec1)
).
The new, working version is listed in full below:
type Vec1<'a> = Vec::<&'a String>; fn fun1<'a>(s1: &'a String, v1: &mut Vec1<'a>) { v1.insert(0, s1); } fn main() { let mut vec1 = Vec1::new(); let str1 = String::from("abcdd"); fun1(&str1, &mut vec1); println!("{:?}", vec1); }
I couldn’t find this solution in the original Stack Overflow question, so I thought it would be worth documenting. While we don’t know exactly why the original author wanted to store string references in a vector, this solution aligns with that intention.
❹ I find Rust lifetimes a bit difficult to follow. Troubleshooting isolated problems like this one, however, feels insightful and helps enhance our understanding.
Thank you for reading. I hope you find the information in this post useful. Stay safe, as always.
✿✿✿
Feature image sources: