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

Wat*_*hiJ 8 unsafe rust

我知道我们可以从引用 -> 原始指针 -> 地址 ( 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?
    }
}
Run Code Online (Sandbox Code Playgroud)

kmd*_*eko 17

是的unsafe,但是是的:

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

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

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

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

  • 指针上的“as_ref”方法也是一个选项。 (7认同)