Box provides exclusive (single) ownership of heap-allocated data, while Rc (Reference Counted) provides shared ownership through reference counting. The fundamental difference is: one owner vs many owners.
Box — exclusive ownership:
1let boxed = Box::new(String::from("owned"));2let moved = boxed; // Move ownership3// boxed is now invalid — can't use it4drop(moved); // String is freed here
Rc — shared ownership:
1use std::rc::Rc;23let shared = Rc::new(vec![1, 2, 3]);4let owner1 = Rc::clone(&shared);5let owner2 = Rc::clone(&shared);6// All three point to the same Vec on the heap7println!("Owners: {}", Rc::strong_count(&shared)); // 38drop(owner1);9println!("Owners: {}", Rc::strong_count(&shared)); // 210drop(owner2);11drop(shared); // Vec is freed here
When to use Box:
Box<dyn Trait>).When to use Rc:
Common mistakes:
Rc<RefCell<T>> for interior mutability.