📦
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>>でリクエスト間状態共有