为何标记为'static生命周期的Rust对象可被丢弃?
解答
核心误解:'static不是"永不销毁"的意思
很多Rust新手会误以为'static生命周期意味着对象永远不会被销毁,但实际上它的含义是:
- 引用可以安全地存活到程序结束,比如字符串字面量(如
"App")的内存会在整个程序运行期间保留,持有它的引用永远不会变成悬垂引用。 - 它不约束包含该引用的结构体实例的存活时长,结构体实例的销毁完全由Rust的所有权规则决定:当实例失去所有所有者时,就会被自动调用
drop销毁。
你的代码中发生了什么
App<'static>的真实含义:这里的'static只是指定App结构体中name字段的引用是'static类型(指向字符串字面量),和App实例本身能不能被销毁没有关系。- 替换操作触发销毁的逻辑:
- 静态变量
APP是Arc<Mutex<App<'static>>>,Mutex内部持有App实例的所有权。 - 当你执行
*APP.lock().unwrap() = App { name: "App2" }时,你是把Mutex里的旧App实例替换成新实例。此时旧实例不再被任何变量或容器持有,所有权彻底转移,Rust会自动销毁它。 set_app函数的逻辑完全一致:新的App<'static>替换掉Mutex中的旧实例,旧实例失去所有所有者,触发drop。
- 静态变量
总结
'static生命周期管的是引用的有效性,不是对象的存活时间。只要对象失去了所有所有者,不管它内部的引用是不是'static,都会被Rust销毁——这完全符合Rust的所有权机制。
内容的提问来源于stack exchange,提问作者WillR27
相关产品推荐
相关产品推荐

