为何这段Rust代码中的'static生命周期无法满足要求?
为什么带有
'static生命周期注解的引用会触发“借用值生命周期不足”错误? 问题重现
我写了一段Rust代码,预期能正常编译:
let mut some_str: &'static str = "Hello world"; let _borrow: &'static mut &'static str = &mut some_str;
但编译时收到以下错误:
--> src/lib.rs:26:50 | 25 | let mut some_str: &'static str = "Hello world"; | ------------ binding `some_str` declared here 26 | let _borrow: &'static mut &'static str = &mut some_str; | ------------------------- ^^^^^^^^^^^^^ borrowed value does not live long enough | | | type annotation requires that `some_str` is borrowed for `'static` 27 | } | - `some_str` dropped here while still borrowed
我困惑的点在于:我认为两个引用都是'static生命周期,应该匹配,但错误提示some_str在被借用时就被销毁了,想知道原因。
原因解析
你混淆了变量自身的生命周期和变量所指向数据的生命周期:
some_str是一个栈上的可变变量,它的生命周期仅限于当前代码块(从声明到代码块结束的}),和'static完全无关。some_str里面存储的&'static str是指向静态存储区中字符串字面量的引用,这个引用的生命周期才是'static。
当你写&mut some_str时,你创建的是指向some_str这个栈变量的可变引用,而不是指向它所引用的字符串字面量的引用。这个可变引用的生命周期默认是some_str的生命周期(即代码块内),但你强行给它注解了&'static mut &'static str,要求这个可变引用必须能存活到整个程序运行期间。
但some_str在代码块结束时就会被销毁,此时这个被注解为'static的可变引用还“指着”已经不存在的变量,这显然违反了Rust的内存安全规则,所以编译器报错。
修正方案
如果你只是想得到一个指向静态字符串的可变引用,不需要借用栈变量some_str,可以直接创建:
let _borrow: &'static mut &'static str = &mut "Hello world";
或者去掉不必要的'static注解,让编译器自动推导生命周期:
let mut some_str: &'static str = "Hello world"; let _borrow = &mut some_str;
内容的提问来源于stack exchange,提问作者Parker
相关产品推荐
相关产品推荐

