Rust生命周期示意图中为何'a比'b先结束?二者不该在花括号末尾同时结束吗?
Rust生命周期
'a早于'b的原因说明 你提到的示意图对应的是如下无法通过编译的示例代码:
fn main() { let r; // 生命周期'b从这里开始 { // 进入内部作用域 let x = 5; // 生命周期'a从这里开始 r = &x; // r持有x的引用 } // 内部作用域结束,x被销毁,生命周期'a到此终止 println!("r: {}", r); // 这里尝试访问已经失效的引用r } // main函数作用域结束,r被销毁,生命周期'b到此终止
- Rust的生命周期严格绑定变量的作用域,变量的生命周期从声明语句开始,到它所在的最内层封闭作用域的末尾结束:
'a是变量x的生命周期,x声明在内部嵌套的花括号作用域里,所以内部花括号执行结束时,x就会被自动销毁,对应的'a生命周期也在此处结束。'b是变量r的生命周期,r声明在main函数的外层作用域里,作用域覆盖整个main函数,所以只有到main函数末尾的花括号处,r才会被销毁,'b生命周期才结束。
- 你产生疑问的核心原因是混淆了两个变量所属的作用域层级:两个变量并不在同一层作用域,生命周期自然不会同时结束。只有当两个变量声明在同一层作用域时,才会按照声明逆序先后销毁,生命周期结束时间接近但也不是完全同步。
这个示例本身就是用来演示Rust如何避免悬垂引用:r持有的引用对应的对象生命周期比自身短,在引用生效前对象就已经被销毁,所以借用检查器会直接拒绝这段代码编译,避免运行时出现访问野指针的问题。
内容的提问来源于stack exchange,提问作者Plonetheus
相关产品推荐
相关产品推荐

