我正在测试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 回答
“未定义的行为”包括“它似乎正常工作” . 在未定义行为方面,您可以犯的最大错误是将正确的结果解释为缺少未定义的行为 .
顺便说一句,它对我不起作用(并且每次运行时值都会改变) .