所有権と借用

Rust Smart Pointers: Box and Rc

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

  • 中級
  • 約3分で読めます
  • 実行できるサンプル 1 件
学べること
  • 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.

重要なポイント

  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.

実行できる Rust のサンプル

Rust
コードを実行 →
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));
}
この例の実行ボタンを作成 実行結果
sum = 6
shared config / shared config
owners: 3

練習

サンプルをオンラインコンパイラーで開き、値を変えたり行を追加したりして、実行する前に出力を予想してみましょう。次に、わざとコードを壊してコンパイラーのメッセージを読んでみてください。

このレッスンを終えましたか?

学習済みにすると進み具合を記録できます。

チャレンジで練習する

このレッスンの内容を使って実際の問題を解きましょう。各チャレンジはブラウザで動き、すぐにテストされ、AI のレビューも受けられます。

すべてのチャレンジ