You’re right that ownership and borrow checking are separate concepts from having a garbage collector. But their purpose overlaps: ownership and borrowing ensure memory safety at compile time, whereas a garbage collector manages it at runtime. Rust’s model avoids the runtime cost of a garbage collector while still ensuring safety, which is a different but effective way of tackling the same problem.