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);    
}

我不知道答案,但我想我应该咬紧牙关,添加一个显式变量,如果只是为了让代码尽可能清晰易懂<代码>不安全
需要足够的脑力。