我知道我们可以从引用 -> 原始指针 -> 地址 ( 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)
| 归档时间: |
|
| 查看次数: |
10811 次 |
| 最近记录: |