Box provides exclusive ownership — one owner, immediate cleanup. Rc provides shared ownership — many owners, cleanup when last owner drops. Both allocate on the heap.
Box — exclusive:
1fn take_ownership(b: Box<String>) {2 println!("Got: {}", *b);3 // b dropped here — memory freed4}56let s = Box::new(String::from("hello"));7take_ownership(s);8// s is invalid here
Rc — shared:
1use std::rc::Rc;23let data = Rc::new(vec![10, 20, 30]);4let r1 = Rc::clone(&data);5let r2 = Rc::clone(&data);67println!("{} {} {}", data[0], r1[1], r2[2]); // 10 20 308drop(r1);9drop(r2);10// data still valid — count is 111drop(data); // Now freed
When to use Box:
When to use Rc:
Common mistakes: