fn test() -> *const Vec<u8> {
let b = vec![9_u8];
let ret: *const Vec<u8> = &b;
println!("ret ptr={:#p} inside {:#p}", ret, b.as_ptr());
std::mem::forget(b);
ret
}
fn main() {
let a = test();
let v = unsafe {
&*a
};
println!("ret ptr={:#p} inside {:#p} value={}", v, v.as_ptr(), v[0]);
println!("ret ptr={:#p} inside {:#p} value={}", v, v.as_ptr(), v[0]);
}
我的机器给出了:
ret ptr=0x00007fffc5d85690 inside 0x00005650a61cfaa0
ret ptr=0x00007fffc5d85690 inside 0x00005650a61cfaa0 value=9
ret ptr=0x00007fffc5d85690 inside 0x00005650a572a348 value=76
最后一行的值突然变化的问题,这是某种错误吗?
通过使用
std::mem::forget
,您可以避免删除 Vec
,从而使 9_u8
持续存在。但是,您的引用指向 b
,它是一个局部变量,因此它的内存仍将被回收用于其他函数调用(如 println!
所示)。所以你之后从v[0]
得到的值是无意义的。
Vec::leak
。