📦

Box、Rc、Arc、RefCell — スマートポインタガイド

所有権ルールを柔軟に回避するツール

所有権ルールは強力だが、全パターンをカバーできない。

Box<T> — ヒープに値を割り当てる。再帰的型(リンクドリスト等)に必須。コンパイル時にサイズが分からない型にも使う。

Rc<T> — 参照カウント。所有者が複数必要な時。最後のRcがdropされると値が解放。シングルスレッド専用。

Arc<T> — Atomic Rc。マルチスレッドで共有所有権が必要な時。Rcのスレッド安全版。

RefCell<T> — ランタイムに借用ルールを検査。コンパイル時に安全性が証明できないパターンで使用。誤用するとランタイムパニック。

実戦ではArc<Mutex<T>>を多用する — マルチスレッドで共有可変データを扱う標準パターン。

キーポイント

1

Box<T> — ヒープ割り当て+所有権移動(再帰型、trait object)

2

Rc<T> / Arc<T> — 参照カウント共有所有権(シングル/マルチスレッド)

3

RefCell<T> — ランタイム借用検査(Interior Mutabilityパターン)

4

Arc<Mutex<T>> — マルチスレッド共有可変データの標準パターン

メリット

  • 所有権ルールが許さないパターンを安全に実装
  • Rc/ArcはGCなしで自動メモリ解放

デメリット

  • Rc/Arcは循環参照時メモリリーク(Weakで解決)
  • RefCellはランタイムパニック可能 — コンパイル時安全性を犠牲

ユースケース

ツリー/グラフデータ構造 — ノード間の共有参照 並行サーバー — Arc<Mutex<State>>でリクエスト間状態共有