为什么这个Rust程序不会崩溃?

5
考虑以下 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

当我们设置z[0]时,Rust 应该尝试释放它,但由于z[0]未初始化,程序应该崩溃。然而,它可以正常运行。为什么?

3
我猜测这是关于z..set_len的实现细节导致的。一旦你使用了不安全的语义(在任何语言中),所有的赌注都取消了。如果有的话,当你尝试访问赋值给z[0]的位置覆盖掉的内容时,它可能会在后面崩溃。 - jpaugh
1个回答

7

Vec 堆分配的内存未初始化时,它通常会被填充为零,这样一个以零填充的 Vec 就是一个空的 VecStringVec 具有廉价的构造函数,因为它们不为空数组分配空间)。因此,没有需要释放的分配,所以在这种情况下它不会崩溃。非常轻微的修改或在具有略有不同的未初始化内存语义的机器上运行,很容易导致其崩溃(这是一件好事——崩溃通常比微妙的错误更容易调试)。

这个诊断可以被证明是正确的。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接