首页 文章

发生运行时混乱时,堆栈/堆分配类型会发生什么?

提问于
浏览
2

在发生恐慌之前在堆或堆栈上分配的类型会发生什么?是否已调用析构函数以便取消分配类型?他们在记忆中徘徊等待被其他一些过程覆盖吗?或者它完全是另一回事?

我不知道,因为我是Rust和系统编程的新手 .

1 回答

  • 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!
    

    请注意,这里堆栈或堆没有真正的区别 . 任何堆分配的项目都会在堆栈上指向它 . 当堆栈上的句柄超出范围时,它会清理堆资源 .


    堆栈被解开,直到它从当前线程退出(如果's the main thread, the program exits). It'也可以使用catch_unwind . 请注意使用它:

    建议不要将此功能用于一般的try / catch机制 . [...]请注意,此功能可能无法捕获Rust中的所有恐慌 .

    请注意,我默认说 . 您还可以使用选项进行编译,从而将panics直接转换为中止流程 . 此时,该过程结束,不再运行析构函数 .

    如果你在析构函数中恐慌,那么它也会游戏结束:进程将被中止 .

相关问题