【发布时间】:2020-04-04 12:11:43
【问题描述】:
在编译我为 Firecracker 所做的更改时遇到了终身错误(在 aarch64 上,但我怀疑这个问题与架构有关):
error[E0716]: temporary value dropped while borrowed
--> src/vmm/src/device_manager/mmio.rs:174:24
|
174 | let int_evt = &serial
| ________________________^
175 | | .lock()
176 | | .expect("Poisoned legacy serial lock")
| |__________________________________________________^ creates a temporary which is freed while still in use
177 | .interrupt_evt();
| - temporary value is freed at the end of this statement
178 | vm.register_irqfd(int_evt, self.irq)
| ------- borrow later used here
|
= note: consider using a `let` binding to create a longer lived value
原始代码(编译良好)是:
vm.register_irqfd(&serial
.lock()
.expect("Poisoned legacy serial lock")
.interrupt_evt(), self.irq)
.map_err(Error::RegisterIrqFd)?;
我不明白其中的区别。错误消息似乎表明 expect() 正在返回一个临时文件,并且我正在对它进行 const 引用,在 C++ 中这将延长临时文件的生命周期,不是在 Rust 中吗?无论哪种方式,为什么它在原始代码中起作用,但在我绑定到左值之后却不起作用(C++ 用语,我不确定它是否与 Rust 相同)?
我尝试在这里创建一个SSCE,但它按预期工作!
【问题讨论】:
-
你的 MRE 应该是这样才能满足鞭炮中的行为:play.rust-lang.org/…
-
这是他们的代码的工作版本:play.rust-lang.org/…,您可以考虑更改您的问题这两个示例之间有什么区别。以及为什么它适用于字段访问但不适用于 getter。