考虑一下这个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]
未初始化,它应该使程序崩溃。但它运行正常。为什么?
答案 0 :(得分:7)
虽然Vec堆分配中的内存未初始化,但最常用零填充,而归零Vec
为空Vec
(String
和{{1}有廉价的构造函数,因为它们没有为空数组进行分配)。因此没有免费分配,因此在这种特殊情况下它不会崩溃。非常轻微的修改,或者在具有稍微不同的未初始化内存语义的机器上运行它可能很容易导致它崩溃(这将是一件好事 - 崩溃通常比微妙的错误更容易调试)。