Ich habe das Kapitel "Lebenszeiten" des Rust-Buches gelesen und bin auf dieses Beispiel für eine benannte / explizite Lebenszeit gestoßen:
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
Mir ist ziemlich klar, dass der Fehler, der vom Compiler verhindert wird, die Verwendung der Referenz ist, die zugewiesen wurde x: nachdem der innere Bereich fertig ist, fund daher &f.xungültig wird und nicht zugewiesen werden sollte x.
Mein Problem ist, dass das Problem ohne die explizite 'a Lebensdauer leicht hätte analysiert werden können, indem beispielsweise auf eine illegale Zuordnung eines Verweises zu einem größeren Bereich geschlossen wurde ( x = &f.x;).
In welchen Fällen werden explizite Lebensdauern tatsächlich benötigt, um Use-After-Free-Fehler (oder Fehler anderer Klassen?) Zu verhindern?