やってみる

アウトプットすべく己を導くためのブログ。その試行錯誤すらたれ流す。

Rustのスマートポインタ(Dropトレイト)

 デストラクタ。スコープを抜けるときに実行する。リソース解放などに使う。

成果物

参考

std::ops::Dropトレイト

main.rs

struct CustomSmartPointer {
    data: String,
}
impl Drop for CustomSmartPointer {
    fn drop(&mut self) { println!("Drop!!: {}", self.data); }
}
fn main() {
    let c = CustomSmartPointer { data: String::from("my") };
    let d = CustomSmartPointer { data: String::from("other") };
    println!("Created.");
}
$ rustc main.rs
$ ./main
Created.
Drop!!: other
Drop!!: my

 スコープを抜けたら自動的に呼び出される。

自分で呼べない

 任意のタイミングで解放したいときもある。

fn main() {
    let c = CustomSmartPointer { data: String::from("some data") };
    println!("CustomSmartPointer created.");
    c.drop();
}
error[E0040]: explicit use of destructor method
  --> main.rs:14:7
   |
14 |     c.drop();
   |       ^^^^ explicit destructor calls not allowed

 そんなときはstd::mem::drop関数を使う。

std::mem::drop関数

fn main() {
    let c = CustomSmartPointer { data: String::from("my") };
    let d = CustomSmartPointer { data: String::from("other") };
    drop(c);
    println!("Created.");
}
$ rustc main.rs
$ ./main
Drop!!: my
Created.
Drop!!: other

 drop()関数にDropトレイトを実装した値を渡せばいい。

所感

 Rustでは二重解放エラーが起こり得ない。デストラクタの実装もできて、任意のタイミングで削除できるのに。すばらしい。

対象環境

$ uname -a
Linux raspberrypi 4.19.42-v7+ #1219 SMP Tue May 14 21:20:58 BST 2019 armv7l GNU/Linux

前回まで