为何两段相似Rust代码仅其一出现`temporary value dropped while borrowed`错误?
为什么
&[2]能正常运行,&[b]却触发临时值释放错误? 核心原因是字面量数组和基于栈变量创建的临时数组的生命周期完全不同:
1. &[&[2]]的运行逻辑
[2]是由整数字面量2创建的数组,这类字面量数组的生命周期是'static——它会被编译到程序的静态存储区,整个程序运行期间都存在。因此&[2]这个引用的生命周期也是'static,不会被提前释放。
当你创建&[&[2]][..]这个切片时,它指向的是一个包含'static引用的数组切片,这个切片的生命周期足够覆盖后续的println!调用,所以不会触发错误。
2. &[&[b]]的报错逻辑
b是栈上的局部变量,[b]是临时创建的数组——这个临时数组只会在当前语句(let c = &[&[b]][..];)的执行期间存在,语句结束后就会被Rust自动销毁。
你对这个临时数组取的引用&[b],生命周期仅限于这个临时数组的存活时间。当你把这个引用放到外层数组[&[b]]中,再取切片[..]得到c,此时c的生命周期依赖于那个即将被销毁的临时数组。但后续的println!还在使用c,这就导致了“临时值在仍被借用时被释放”的错误——Rust的借用检查器不允许这种悬空引用的情况。
解决方法
正如编译器提示的那样,把临时数组绑定到一个具名变量上,延长它的生命周期:
let binding = [b]; let c = &[&binding][..];
此时binding的生命周期覆盖到println!调用,&binding的引用就可以安全地被c持有并使用了。
内容的提问来源于stack exchange,提问作者le vu quang
相关产品推荐
相关产品推荐

