首页 > 解决方案 > 函数调用中的临时对象何时在 Rust 中被删除?

问题描述

Rust 函数调用中临时对象的作用域规则是什么?我真正感兴趣的是以下操作是否安全:

fn foo() -> CString { /* */ }
fn bar(arg: *const libc::c_char) { /* */ }

bar(foo().as_ptr())

我创建了最小的示例,它可以按我的意愿工作——在函数调用返回后删除对象。

struct Bar {
    pub x: u32
}

impl Bar {
    pub fn new(x: u32) -> Self {
        println!("New Bar made!");
        Bar { x }
    }
    pub fn extract(&self) -> u32{
        self.x
    }
}

impl Drop for Bar {
    fn drop(&mut self) {
        println!("Bar dropped!");
    }
}

pub fn foo(arg: u32) {
    println!("Function called with arg = {}", arg);
}

fn main () {
    foo(Bar::new(12).extract());
}

我可以依靠这种行为吗?

标签: rustlifetime

解决方案


rust reference中,在“Temporary Lifetimes”下,它说:

...临时值的生命周期通常是

  • 最里面的封闭语句;块的尾部表达式被认为是包含该块的语句的一部分,或者

在您的案例中,最里面的封闭语句是对bar( ). 同一部分中有一些与您的案例非常相似的示例。

如果不是这种情况,编译器就不会编译您的代码。


推荐阅读