为什么这个指针在 Rust 中释放之前会被垃圾收集

问题描述 投票:0回答:1

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

最后一行的值突然变化的问题,这是某种错误吗?

pointers rust memory-management garbage-collection unsafe
1个回答
0
投票

通过使用

std::mem::forget
,您可以避免删除
Vec
,从而使
9_u8
持续存在。但是,您的引用指向
b
,它是一个局部变量,因此它的内存仍将被回收用于其他函数调用(如
println!
所示)。所以你之后从
v[0]
得到的值是无意义的。

顺便说一句,完成您基本上所做的事情的安全方法是使用

Vec::leak

© www.soinside.com 2019 - 2024. All rights reserved.