You need to enable JavaScript to run this app. Rust生命周期示意图中为何'a比'b先结束?二者不该在花括号末尾同时结束吗?
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.19 16:06:04