取消引用指向已删除值的指针并且内存仍然存在

Dereferencing a pointer to a dropped value and the memory is still there

我正在玩不安全的 Rust 并尝试实施,但我发现了一些我不明白的东西。我想我肯定会有一个悬空指针,并且在尝试 运行 时会遇到某种 运行 时间错误,但我没有。

fn main() {
    let s1 = String::from("s1");
    let s1_raw_ptr: *const String = &s1;
    drop(s1);
    
    unsafe {
        let s = &*s1_raw_ptr;
        println!("s recovered from raw pointer: {:?}", s);
    }
}

这输出:

s recovered from raw pointer: "s1"

我认为当一个值超出 Rust 的范围时,它会立即被清除。将原始指针取消引用到现在删除的值是如何工作的?

当一个字符串在 Rust 中被删除时,最终被调用的是系统分配器上的 Allocator::deallocate。在此之后,使用数据是未定义的行为,所以任何事情都可能发生!但在实践中,如果没有任何时髦的编译器优化,往往会发生的情况是,您只是获取存储在内存中的任何数据。如果那个地方没有任何新的分配,那么你就得到之前的任何数据。

释放内存分配后,分配不会发生任何事情。通过将数据设置为全零(或其他一些值)来清除数据是没有意义的,因为任何新分配的内存总是需要由该内存的用户初始化。