Rust's ownership system guarantees memory safety without a garbage collector. Three rules:
- Each value has an owner
- Only one owner at a time
- When the owner goes out of scope, the value is dropped
let s1 = String::from("hello");
let s2 = s1; // s1 is moved, no longer valid