您可以将内存地址作为 usize 转换为具有生命周期的引用吗?

Can you cast a memory address as a usize into a reference with a lifetime?

我知道我们可以从引用 -> 原始指针 -> 地址进行转换 (usize),但我们可以向后转换吗,尤其是使用生命周期注解?例如,我有以下代码:

struct Name<'a> {
    name: &'a str,
}

impl<'a> Name<'a> {
    fn to_addr<'b>(&'b self) -> usize { /* ... */ }
    fn from_addr<'b>(address: usize) -> &'b Name<'a> {
        // assuming the address is valid,
        // is this even possible to return an reference with both lifetimes?
    }
}

unsafe,但是是的:

fn from_addr<'b>(address: usize) -> &'b Name<'a> {
    unsafe { &*(address as *const Self) }
}

你必须自己确保 Rust 的内存安全要求:除了确保生命周期正确之外,指针必须是非空的、非悬挂的、对齐的、不可改变的别名等。

我实际上将整个函数标记为 unsafe,因为生命周期 'b(并且取决于使用 'a)是在调用站点确定的。调用者应该知道为了安全地使用它需要保证。

unsafe fn from_addr<'b>(address: usize) -> &'b Name<'a> {
    &*(address as *const Self)
}