为什么这个 Rust 程序不会崩溃?
Why doesn't this Rust program crash?
考虑这个 Rust 程序:
fn main() {
let mut z : Vec<Vec<(bool,f64)>> = Vec::with_capacity(10);
unsafe { z.set_len(10); }
z[0] = vec!((true,1.));
println!("{:?}", z[0]);
}
https://play.rust-lang.org/?gist=ccf387ed66a0d8b832ed&version=stable
Rust 应该在我们设置它时尝试删除 z[0]
,并且由于 z[0]
未初始化,它应该使程序崩溃。但是,它运行良好。为什么?
虽然 Vec 的堆分配中的内存未初始化,但它最常被零填充,零 Vec
是空的 Vec
(String
和 Vec
具有廉价的构造函数,因为它们不会为空数组分配内存)。因此没有分配给 free,因此在这种特殊情况下它不会崩溃。非常轻微的修改,或者 运行 在具有稍微不同的未初始化内存语义的机器上,很容易导致它崩溃(这将是一件好事——崩溃通常比细微的错误更容易调试)。
考虑这个 Rust 程序:
fn main() {
let mut z : Vec<Vec<(bool,f64)>> = Vec::with_capacity(10);
unsafe { z.set_len(10); }
z[0] = vec!((true,1.));
println!("{:?}", z[0]);
}
https://play.rust-lang.org/?gist=ccf387ed66a0d8b832ed&version=stable
Rust 应该在我们设置它时尝试删除 z[0]
,并且由于 z[0]
未初始化,它应该使程序崩溃。但是,它运行良好。为什么?
虽然 Vec 的堆分配中的内存未初始化,但它最常被零填充,零 Vec
是空的 Vec
(String
和 Vec
具有廉价的构造函数,因为它们不会为空数组分配内存)。因此没有分配给 free,因此在这种特殊情况下它不会崩溃。非常轻微的修改,或者 运行 在具有稍微不同的未初始化内存语义的机器上,很容易导致它崩溃(这将是一件好事——崩溃通常比细微的错误更容易调试)。