2016-10-31 4 views
2

パニックが発生する前にヒープまたはスタックに割り当てられているタイプはどうなりますか?デストラクタが呼び出され、型の割り当てが解除されていますか?彼らは、他のプロセスによって上書きされるのを待っているメモリの中にいるのですか?それとも全く別のものなのでしょうか?実行時のパニックが発生した場合、スタック型/ヒープ割り当て型はどうなりますか?

私はRustとシステムプログラミング全般に慣れて以来、よく分かりません。

答えて

5

デフォルトでは、スタックは巻き戻され、デストラクタが実行されます。あなた自身のためにこれを証明することができます。

struct Noisy; 

impl Drop for Noisy { 
    fn drop(&mut self) { 
     println!("Dropping!"); 
    } 
} 

fn main() { 
    let _on_stack = Noisy; 
    let _on_heap = Box::new(Noisy); 

    panic!("Oh no!"); 
} 

これが印刷されます:

Dropping! 
Dropping! 

注スタックやヒープには実質的な違いはここにありませんことを。ヒープに割り当てられたアイテムは、何かを指しているスタック上に何かがあります。スタック上のハンドルが有効範囲外になると、ヒープリソースがクリーンアップされます。


スタックは、現在のスレッドから終了するまで巻き戻されます(メインスレッドの場合、プログラムは終了します)。 catch_unwindを使用することもできます。このかかわらを使用して注意してください:

それはでない一般のtry/catchメカニズムのために、この機能を使用することをお勧めします。 [...]この機能はがパニックをすべてキャッチしないことに注意してください。 in Rust。

は、デフォルトでと言っています。また、パニックが直接プロセスを中止するように翻訳するオプションでコンパイルすることもできます。その時点で、プロセスは終了し、デストラクタはそれ以上実行されません。

デストラクタでパニックになった場合、ゲームオーバーです。プロセスは中止されます。

関連する問題