Rust's borrow checker isn't the issue with this example. Consider: fn force_realloc(vec: &mut Vec<i32>) -> i32 { for i in 0 .. 100_000_000 { vec.push(i); } return 1234; } fn main() { let mut vec = Vec::new(); vec.push(0); println!("{:?}", unsafe { std::mem::transmute::<&i32, usize>(&vec[0]) }); vec[0] = force_realloc(&mut vec); println!("{:?}", unsafe { std::mem::transmute::<&i32, usize>(&vec[0]) }); println!("{:?}", vec[0]); println!("{:?}", vec.len()) } Run
`vec[0]`'s address changes. Rust just doesn't consider it until after the function returns.