TL;DR
ポインタのように振る舞いながら、追加のメタデータと機能を持つデータ構造。C++ で生まれ、Rust の標準ライブラリにも Box<T>、Rc<T>、RefCell<T> などがある。
なぜ必要か
The Rust Programming Language によると、参照(&)はデータを借用するだけで、参照する以上の機能を持たない。一方、スマートポインタは多くの場合、指すデータを所有する。Effective Rust では、相互に関連するデータ構造を管理するときや、生存期間の制約で参照を使いにくいときに、スマートポインタを使うよう勧めている。Rc と RefCell を組み合わせると、借用チェッカの制約を避けられることもある。
仕組み
Rust のスマートポインタはふつう構造体で実装され、Deref トレイトと Drop トレイトを実装する。Deref によって参照と同じように扱えるので、参照とスマートポインタのどちらでも動くコードを書ける。Drop によって、スコープを抜けたときに実行する処理を決められる。
例
Box<T>: 値をヒープに確保するRc<T>: 参照カウントで、複数の所有者を持てるようにする。スレッド間で共有するときはArc<T>を使うRefCell<T>: 借用規則をコンパイル時ではなく実行時に検査し、内部可変性を実現する
注意点
Effective Rust 項目15 によると、Rc<RefCell<T>> は借用違反をコンパイルエラーではなく実行時の panic! にする。また、親子が互いを Rc で指すと循環参照になり、メモリリークの原因になるので、片方を Weak<T> にする。