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.