← 解説「Drop — 値が消えるときの処理」に戻る
サンプルコードで身につける: Drop — 値が消えるときの処理
解説で学んだ概念を、5つの具体例で確認します。素朴な例から実務寄りの例へと進みます。
1最小の Drop — スコープの終わりに自動で呼ばれる
Drop を実装した値がスコープを抜けるとき、drop メソッドが自動で呼ばれることを確かめる最小の例です。main の最後の println! より後に「破棄しました」が出力されることに注目してください。後片付けのコードをどこにも呼び出していないのに実行される、というのが Drop の本質です。
Rust
2破棄は宣言と逆順 — 後に作ったものから消える
複数の値は宣言と逆の順番で破棄されることを出力で確認する例です。後から作った値が先に消えるのは、「後の値が前の値に依存しているかもしれない」ためで、C++ などでも同じ規約です。リソース同士に依存関係があるとき、この順序保証が安全な後片付けを支えます。
Rust
3drop(値) で早めに手放す — ロックの解放
スコープの終わりを待たず、標準の drop 関数でロック風のリソースを今すぐ解放する例です。drop(lock) は所有権を関数に渡して即座に破棄させるだけで、特別な仕組みではありません。「ロックを持つ時間を最小にしたい」という実務の場面で頻出するイディオムです。
Rust
4コレクションごと破棄 — 要素の drop も連鎖する
Vec を破棄すると、中の要素1つひとつの drop も自動で呼ばれることを示す例です。コンテナが消えるとき中身の後片付けも連鎖するため、「リストに入れた接続を全部閉じる」ようなループを自分で書く必要がありません。Box がヒープを解放できるのも、この連鎖の仕組みと同じです。
Rust
5スコープロガー — 処理の終了を自動で記録
値が消えるときに [終了] ログを出すロガーで、関数を抜けたことを自動記録する実務寄りの例です。関数がどこから return しても drop は必ず呼ばれるため、「終了ログの書き忘れ」が構造的に起きません。リソースの確保と解放を値の生存期間に結びつけるこの設計は RAII と呼ばれ、Drop 活用の代表格です。
Rust