Drop トレイト
値がスコープから外れたなどで、値が不要になった場合、Rustはその値に対してデストラクタを実行する。 デストラクタにより、メモリ/ファイルディスクリプタ/ネットワークソケットなどのリソースが解放される(その値の持つ全ての値が再帰的にデストラクトされる)。
このデストラクタの動作は、std::ops::Drop
トレイトを実装することでカスタマイズできる。
std::ops::Drop
トレイトは以下のように定義されている。
pub trait Drop { fn drop(&mut self); }
含まれている全ての値のデストラクタは自動で行われるため、ほとんどの場合 Drop
を実装する必要はない。
デストラクタは、構造体の場合フィールドが宣言された順で行われ、ローカル変数の場合は宣言の逆順で行われる。
Drop
トレイトの drop()
メソッドは、その値の持つフィールドや要素をドロップする前に自動的に呼び出される(drop()
メソッドを明示的に呼び出した場合はコンパイルエラーとなる)。
Drop
と Copy
を同じ型に対して実装することはできない。
例として、OwnedSocket
では以下のように unsafe
ブロックでソケットのクローズ処理が行われる。
impl Drop for OwnedSocket { #[inline] fn drop(&mut self) { unsafe { let _ = sys::c::closesocket(self.socket as sys::c::SOCKET); } } }