首页 文章

为什么在删除的Box上使用ptr :: read()不是未定义的行为?

提问于
浏览
0

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

读完之后,我以为我有两个指向堆上相同位置的指针 . 我的印象是当我离开块时 x 被定义为 x 的析构函数将被运行导致 y 指向释放的内存 . 但是,当我去打印 *y 的值时,它仍会打印正确的值10.我阅读了文档但是可以't seem to figure out why this isn' t UB . 如果有人能为我澄清这一点,我真的很感激 .

PS . 我来自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);
}

1 回答

  • 6

    “未定义的行为”包括“它似乎正常工作” . 在未定义行为方面,您可以犯的最大错误是将正确的结果解释为缺少未定义的行为 .

    顺便说一句,它对我不起作用(并且每次运行时值都会改变) .

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

相关问题