Rust 中生命周期标注的基本规则
- 生命周期参数声明:在函数签名中,生命周期参数用单引号(
'
)开头,后跟一个名称,如 'a
。
- 输入生命周期约束:函数参数中的引用需要声明其生命周期。如果函数有多个引用参数,每个引用参数可能有不同的生命周期参数。
- 输出生命周期约束:如果函数返回一个引用,返回值的生命周期必须与某个输入参数的生命周期相关联,或者被显式标注。
- 生命周期的范围:生命周期参数的范围是从声明的位置开始,到包含它的函数或代码块结束。
函数示例
fn longest<'a>(x: &'a str, y: &'a str) -> &'a str {
if x.len() > y.len() {
x
} else {
y
}
}
生命周期标注确保内存安全的解释
- 输入参数的生命周期:在
longest
函数中,x
和 y
都是 &str
类型的引用,它们共享相同的生命周期 'a
。这意味着在函数调用期间,x
和 y
所引用的数据必须至少存活到函数结束。
- 返回值的生命周期:返回值
&'a str
的生命周期也被标注为 'a
。这确保了返回的引用所指向的数据在函数调用者使用该返回值期间仍然有效。
- 内存安全保障:通过这种生命周期标注,Rust 编译器能够验证在函数执行期间不会出现悬空引用的情况。因为返回的引用的生命周期与输入引用的生命周期相关联,并且输入引用所指向的数据的生命周期在函数调用期间是已知的,所以编译器可以确保返回的引用在使用时不会指向已经释放的内存,从而保证了内存安全。