我正在阅读Rust书的一生一章,我遇到了这个命名/显式生命期的例子:
struct Foo<'a> {
x: &'a i32,
}
fn main() {
let x; // -+ x goes into scope
// |
{ // |
let y = &5; // ---+ y goes into scope
let f = Foo { x: y }; // ---+ f goes into scope
x = &f.x; // | | error here
} // ---+ f and y go out of scope
// |
println!("{}", x); // |
} // -+ x goes out of scope
我很清楚,编译器阻止的错误是赋值给x
的引用的use-after-free:在内部作用域完成后,f
和&f.x
变得无效,不应该赋值给x
。
我的问题是,使用显式的 'a
生命期,问题可以很容易地分析掉没有,例如,通过推断对更广泛的范围(x = &f.x;
)的引用的非法赋值。
在哪些情况下,实际上需要显式生命期来防止free后使用(或其他类?)错误?