我在Ruust中创建了一个双向图,父指针是Ruustborrow 规则的一个明显问题,所以我使用了原始指针,这些指针在理论上是安全的,因为父指针拥有子指针,不能放在子指针之前.我唯一的问题(在我的头脑中)是当图表移动时.如果图形移动,则所有父指针都应该是无效的,因为它们指向图形的旧位置.
但通过举例测试,我得到了不同的结果.不仅在旧指针仍然有效的地方,调试器还在"寄存器&>有效地址"中显示一个新条目,该条目将旧指针映射到新位置. 我的测试代码:
fn main() -> Result<()> {
let m = test();
println!("MT:{}, IT:{}, PTR_MT:{}", m.j, m.inner.i, unsafe {(*m.inner.parent).j});
Ok(())
}
fn test() -> Box<MyType> {
let mut mytype = MyType { inner: MyInnerType { parent: std::ptr::null_mut(), i: 5 }, j:69 };
println!("MT:{}, IT:{}", mytype.j, mytype.inner.i);
mytype.inner.parent = &mut mytype;
Box::new(mytype)
}
struct MyType {
inner: MyInnerType,
j:i32
}
struct MyInnerType {
parent: *mut MyType,
i:i32
}
此行为是否已定义,我可以依赖它来工作吗?