Ownership and Borrowing

Rust Smart Pointers: Box and Rc

Put data on the heap with Box and share one value between several owners with Rc.

  • Intermediate
  • 3 min read
  • 1 runnable example
What you'll learn
  • Box<T> for recursive types
  • Rc<T> for shared ownership
  • Rc::strong_count
A list built with Box
  1. 1Node(1)points to
  2. 2Node(2)points to
  3. 3Node(3)points to
  4. 4Endsum = 6

Pointers that own their data

A smart pointer owns the data it points to. Box<T> stores a value on the heap, which makes recursive types possible. Rc<T> lets several owners share one value by counting them.

List contains itself, so its size would be infinite without Box: a Box has a fixed size because it is only a pointer. Rc::clone does not copy the string, it adds an owner, and strong_count shows three owners. The value is freed when the last owner is gone.

Key points

  1. Box has a fixed size, so a type can contain itself.
  2. Rc::clone adds an owner, it does not copy the data.
  3. The value is freed when the last owner is gone.

Runnable Rust example

Rust
Run code →
main.rs
use std::rc::Rc;

enum List {
    Node(i32, Box<List>),
    End,
}

fn sum(list: &List) -> i32 {
    match list {
        List::Node(value, next) => value + sum(next),
        List::End => 0,
    }
}

fn main() {
    let list = List::Node(1, Box::new(List::Node(2, Box::new(List::Node(3, Box::new(List::End))))));
    println!("sum = {}", sum(&list));

    let shared = Rc::new(String::from("shared config"));
    let reader_a = Rc::clone(&shared);
    let reader_b = Rc::clone(&shared);
    println!("{reader_a} / {reader_b}");
    println!("owners: {}", Rc::strong_count(&shared));
}
Get a Run button for this example Result of running the code
sum = 6
shared config / shared config
owners: 3

Practice

Open the example in the online compiler, change a value or add a line, and predict the output before you run it. Then break the code on purpose and read the compiler's message.

Finished this lesson?

Mark it as learned to track your progress.

Practice with a challenge

Use what this lesson covers to solve a real problem. Each challenge runs in your browser with instant tests and an AI review.

All challenges