Rust 指向临时人员的原始指针可以生锈吗?
我有这样一个函数:Rust 指向临时人员的原始指针可以生锈吗?,rust,Rust,我有这样一个函数: extern { fn foo(layout: *const RawLayout) -> libc::uint8_t; } fn bar(layout: Layout) -> bool { unsafe { foo(&layout.into() as *const _) != 0 } } 其中,Layout是一种可复制类型,可将转换为() 我想确保我了解正在发生的事情,因为这是不安全的。据我所知,layout.i
extern {
fn foo(layout: *const RawLayout) -> libc::uint8_t;
}
fn bar(layout: Layout) -> bool {
unsafe {
foo(&layout.into() as *const _) != 0
}
}
其中,Layout
是一种可复制类型,可将转换为()
我想确保我了解正在发生的事情,因为这是不安全的。据我所知,layout.into()
创建一个临时的RawLayout
,然后&
引用它,并As*const
将其转换为原始指针(*const RawLayout
)。然后调用并返回foo()
函数,最后删除临时RawLayout
对吗?还是有什么棘手的原因让我不能这么做?你说得对。在这种情况下,首先调用foo
,然后删除RawLayout
。这一点在中进行了解释(请按照链接查看实践中的具体示例):
临时值的生存期通常是最内层的
声明
然而,我宁愿听从谢普马斯特的建议。显式引入局部变量有助于代码读者专注于更重要的事情,比如确保不安全的代码是正确的(而不是必须弄清楚临时变量的确切语义)
如何检查这个
您可以使用以下代码检查此行为:
struct Layout;
struct RawLayout;
impl Into<RawLayout> for Layout {
fn into(self) -> RawLayout {
RawLayout
}
}
impl Drop for RawLayout {
fn drop(&mut self) {
println!("Dropping RawLayout");
}
}
unsafe fn foo(layout: *const RawLayout) -> u8 {
println!("foo called");
1
}
fn bar(layout: Layout) -> bool {
unsafe {
foo(&layout.into() as *const _) != 0
}
}
fn main() {
bar(Layout);
}
我不知道答案,但我想我应该咬紧牙关,添加一个显式变量,如果只是为了让代码尽可能清晰易懂<代码>不安全
需要足够的脑力。