发生运行时恐慌时 stack/heap 分配的类型会发生什么情况?
What happens to stack/heap allocated types when a runtime panic occurs?
在发生恐慌之前,在堆或堆栈上分配的类型会发生什么变化?是否调用了析构函数以便释放类型?它们是否在内存中徘徊等待被其他进程覆盖?还是完全不同?
我不知道,因为我是 Rust 和一般系统编程的新手。
默认情况下,堆栈将展开并且析构函数是 运行。你可以自己证明这一点:
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!
请注意,这里的堆栈或堆没有真正的区别。任何堆分配的项目都会在堆栈上有 something 指向它。当堆栈上的句柄超出范围时,它会清理堆资源。
堆栈会展开,直到它从当前线程退出(如果它是主线程,程序就会退出)。也可以使用 catch_unwind
。不过要小心使用这个:
It is not recommended to use this function for a general try/catch mechanism. [...] Note that this function may not catch all panics in Rust.
请注意,我说的是默认 。您还可以使用一个选项进行编译,从而将恐慌直接转化为中止进程。到那时,过程结束,不再有析构函数 运行.
如果您在析构函数中出现恐慌,那么游戏也结束了:进程将中止。
在发生恐慌之前,在堆或堆栈上分配的类型会发生什么变化?是否调用了析构函数以便释放类型?它们是否在内存中徘徊等待被其他进程覆盖?还是完全不同?
我不知道,因为我是 Rust 和一般系统编程的新手。
默认情况下,堆栈将展开并且析构函数是 运行。你可以自己证明这一点:
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!
请注意,这里的堆栈或堆没有真正的区别。任何堆分配的项目都会在堆栈上有 something 指向它。当堆栈上的句柄超出范围时,它会清理堆资源。
堆栈会展开,直到它从当前线程退出(如果它是主线程,程序就会退出)。也可以使用 catch_unwind
。不过要小心使用这个:
It is not recommended to use this function for a general try/catch mechanism. [...] Note that this function may not catch all panics in Rust.
请注意,我说的是默认 。您还可以使用一个选项进行编译,从而将恐慌直接转化为中止进程。到那时,过程结束,不再有析构函数 运行.
如果您在析构函数中出现恐慌,那么游戏也结束了:进程将中止。