← 中文资源

简体中文版本

Rust 报无法返回对本地临时值的引用

通过返回拥有所有权的数据或借用更长久的来源,修复返回本地引用的错误。

阅读英文原文

症状

编译器拒绝返回对本地值的引用,指出该引用会比数据存活更久。这发生在函数创建值并尝试返回其借用,或闭包返回对它所捕获本地值的引用时。数据在函数退出时被丢弃,任何返回的引用都会悬垂,因此检查器阻止它。

诊断

读取被借用的本地;改为返回拥有所有权的值;或从生命周期更长的输入派生引用。

cargo build 2>&1 | head -30

根因

函数会返回一个在其返回时即被丢弃的值的引用,该引用将悬垂,编译器因此拒绝。

修复

返回拥有所有权的值,让调用方决定如何存储;或从生命周期长于调用的输入参数派生返回引用。两者都使所有权显式化并消除悬垂。

验证

重新构建确认错误消失,再跑在调用返回后使用所返回数据的测试。成功使用即证明返回的值或借用有效。

常见陷阱

用 leaking 或 ’static 强行延长生命周期会泄漏内存;应返回拥有所有权的值。