【Rust】Drop トレイト

blog1.mammb.com


Drop トレイト

値がスコープから外れたなどで、値が不要になった場合、Rustはその値に対してデストラクタを実行する。 デストラクタにより、メモリ/ファイルディスクリプタ/ネットワークソケットなどのリソースが解放される(その値の持つ全ての値が再帰的にデストラクトされる)。

このデストラクタの動作は、std::ops::Drop トレイトを実装することでカスタマイズできる。

std::ops::Drop トレイトは以下のように定義されている。

pub trait Drop {
    fn drop(&mut self);
}


含まれている全ての値のデストラクタは自動で行われるため、ほとんどの場合 Drop を実装する必要はない。

デストラクタは、構造体の場合フィールドが宣言された順で行われ、ローカル変数の場合は宣言の逆順で行われる。

Drop トレイトの drop() メソッドは、その値の持つフィールドや要素をドロップする前に自動的に呼び出される(drop() メソッドを明示的に呼び出した場合はコンパイルエラーとなる)。

DropCopy を同じ型に対して実装することはできない。

例として、OwnedSocket では以下のように unsafe ブロックでソケットのクローズ処理が行われる。

impl Drop for OwnedSocket {
    #[inline]
    fn drop(&mut self) {
        unsafe {
            let _ = sys::c::closesocket(self.socket as sys::c::SOCKET);
        }
    }
}