可以将内存地址作为ussize强制转换为具有生存期的引用吗?



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

最新更新