rust - 为什么在放置的 Box 上使用 ptr::read() 不是未定义的行为?

标签 rust undefined-behavior

我正在测试 Rust 的一些不安全功能,主要是 std::ptr 函数,以了解我可能导致未定义行为的方式(出于好奇)。在下面的示例中,我使用 std::ptr::read() 将存储在 x 中的地址移动到 y 中,而无需取消初始化 x.

读取后我认为我有两个指向堆上相同位置的指针。我的印象是,当我离开定义了 x 的 block 时,x 的析构函数将运行,导致 y 指向已释放内存。但是,当我去打印 *y 的值时,它仍然打印出正确的值 10。我阅读了文档,但似乎无法弄清楚为什么这不是 UB。如果有人能为我澄清这一点,我将不胜感激。

附言。我来自 C 背景,所以对 C 的解释可能会让理解实际发生的事情变得更容易一点。

fn main() {
    let mut y: Box<i32>;

    {
        let x: Box<i32> = Box::new(10 as i32);
        unsafe {
            y = ptr::read(&x);
        }
    }
    // I thought the destructor (free) would be called here on x
    // making y point to invalid memory
    // However, the following call to println! still works
    println!("The value of y is {}", *y);
}

最佳答案

“未定义的行为”包括“它似乎工作正常”。当涉及未定义行为时,您可能犯的最严重错误是将正确的结果解释为不存在未定义行为。

顺便说一下,它对我有用(而且每次运行时值都会改变)。

$ cargo run
     Running `target/debug/so-ub`
The value of y is -500126584

关于rust - 为什么在放置的 Box 上使用 ptr::read() 不是未定义的行为?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37849625/

相关文章:

rust - 不能借用 `*self` 作为可变的,因为 `self.history[..]` 也被借用为不可变的

使用 clang 与 C 链接时缺少 Rust 目标文件

c - 为什么我可以在 C 中读取比分配的更多的字符数据?

c++ - 什么是严格的别名规则?

c - 未初始化的指针的计算结果是 true、false 还是导致未定义的行为?

c - 为什么这些构造使用前后递增的未定义行为?

c - 读取不确定值会调用 UB?

Rust "if let"不工作?

rust - 在 polars rust 中使用 groupby 时如何避免深度复制?

string - 为什么从标准输入读取用户输入时我的字符串不匹配?