52979


libraryとして外部から利用する事を想定しています。  
global領域にstart/stopにてメモリの確保と破棄を行うケースがあると思いますが、  
rustではOptionにNoneを設定するだけで問題無いのでしょうか？

下記がC言語のケース  
c code.

[code]

    #include <stdio.h>
    
    typedef struct {}DATA;
    static DATA* gData = NULL;
    
    void start(){
        if(gData == NULL) gData = (DATA*)malloc(sizeof(DATA));
    }
    void stop() {
        free(gData);
        data = NULL;
    }
    
[/code]

Rustによるケース  
rust code

[code]

    struct DATA {}
    
    static mut RUSTDATA : Option<DATA> = None;
    #[no_mangle]
    fn start(){
        unsafe{
            RUSTDATA = Some(DATA{});
        }
    }
    #[no_mangle]
    fn stop(){
        unsafe{
            RUSTDATA = None;
        }
    }
    
[/code]


CC BY-SA 4.0
2019-02-23T08:25:38.633
52966
2019-02-23T17:17:19.640
32285
question
rust
Rustのメモリ解放に関してOptionにNoneを設定するだけで問題無いでしょうか？


> rustではOptionにNoneを設定するだけで問題無いのでしょうか？

`stop`関数で`None`を代入した時に`start`関数で代入したオブジェクトは破棄されるので問題ありません。

例えば`Drop` traitを実装すると確認できます

[code]

    struct DATA {}
    
    impl Drop for DATA {
        fn drop(&mut self) {
            println!("Dropped!")
        }
    }
    
    static mut RUSTDATA: Option<DATA> = None;
    
    #[no_mangle]
    fn start() {
        unsafe {
            RUSTDATA = Some(DATA {});
        }
    }
    #[no_mangle]
    fn stop() {
        unsafe {
            RUSTDATA = None;
        }
    }
    
    fn main() {
        start();
        stop();
        println!("End main thread");
    }
    
[/code]

[code]

    $ cargo run
    Dropped!
    End main thread
    
[/code]

なおグローバル変数に書き込むのは複数のスレッドから書き込む場合に危険なのでunsafeになっています。このような場合にはMutexを使って排他制御を行うのが通例です。

参考: [Rustのstatic変数とthread
local](https://qiita.com/tatsuya6502/items/bed3702517b36afbdbca)


CC BY-SA 4.0
2019-02-23T17:17:19.640
52979
2019-02-23T17:17:19.640
9572
52966
answer