Borrow Errors

As a concrete example of how these borrowing rules prevent memory errors, consider the case of modifying a collection while there are references to its elements:

  1. fn main() {
  2.     let mut vec = vec![1, 2, 3, 4, 5];
  3.     let elem = &vec[2];
  4.     vec.push(6);
  5.     println!("{elem}");
  6. }

Similarly, consider the case of iterator invalidation:

  1. fn main() {
  2.     let mut vec = vec![1, 2, 3, 4, 5];
  3.     for elem in &vec {
  4.         vec.push(elem * 2);
  5.     }
  6. }

This slide should take about 3 minutes.

  • In both of these cases, modifying the collection by pushing new elements into it can potentially invalidate existing references to the collection’s elements if the collection has to reallocate.