您可以将内存地址作为 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)
}
我知道我们可以从引用 -> 原始指针 -> 地址进行转换 (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)
}