gpt4 book ai didi

pointers - 为什么使用不安全代码的二叉树在 Debug模式下内存访问错误,但在发布时却没有?

转载 作者:行者123 更新时间:2023-11-29 08:26:38 24 4
gpt4 key购买 nike

我正在尝试在不安全的 Rust 中实现二叉树,这似乎是调试和发布之间的区别。

这段在调试时执行的代码很可能访问错误的内存地址,但如果在 Release模式下编译似乎没问题。

我完全有可能犯了一个错误,因为我对原始指针很陌生,但输出不同的东西真的很奇怪。

我的不同输出真的是内存访问错误的标志吗?在使用不安全的 Rust 时,这是预期的吗?这是某种代码气味的标志?

在 Debug模式下,我机器上的输出是:

constructing tree
5
constructed
0.000000000000000000000000000000000000000000001
value added

在 Release模式下,我机器上的输出是:

constructing tree
5
constructed
5
value added

这里是代码,我尽可能地减少了。

use std::ptr;

struct Node {
value: f32,
node_left: *mut Node,
node_right: *mut Node,
}

impl Node {
pub fn from_value(value: f32) -> Node {
println!("{}", value);
Node {
value: value,
node_left: ptr::null_mut(),
node_right: ptr::null_mut(),
}
}

fn get_value(&self) -> f32 {
self.value
}
}

pub struct BinaryTree {
root: *mut Node,
}

impl BinaryTree {
pub fn from_value(value: f32) -> BinaryTree {
let mut node = &mut Node::from_value(value);
BinaryTree { root: node }
}

pub fn add(&mut self, value: f32) {
println!("{}", unsafe { self.root.as_mut() }.unwrap().get_value());
}
}

fn main() {
println!("constructing tree");
let mut x = BinaryTree::from_value(5.0f32);
println!("constructed");
x.add(2f32);
println!("value added");
}

我在使用 Rust 1.32.0 的 Oracle VM 中的 Ubuntu 18.04 上运行了这个。

最佳答案

BinaryTree::from_value 中,您正在创建一个新的 Node,然后存储一个指向它的指针。但是,Node 分配在堆栈上,并在您调用 BinaryTree::add 之前被删除。因为您使用的是指针和 unsafe 而不是引用,所以 Rust 编译器无法就此类生命周期问题向您发出警告。

至于为什么在 Debug模式下失败,但在 Release模式下可以工作,可能是由于优化只对 Release模式启用。

关于pointers - 为什么使用不安全代码的二叉树在 Debug模式下内存访问错误,但在发布时却没有?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54833646/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com