Warum werden in Rust explizite Lebensdauern benötigt?
Ich habe das @ gelesLebenslange Kapitel des Rust-Buches, und ich bin auf dieses Beispiel für eine benannte / explizite Lebensdauer 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 klar, dass der Fehler, der vom Compiler verhindert wird, das @ is use-after-free der Referenz, die @ zugewiesen wurx
: Nachdem der innere Bereich fertig ist,f
und deshalb&f.x
wird ungültig und sollte nicht @ zugewiesen werdx
.
Mein Problem ist, dass das Problem leicht hätte weg analysiert werden könnenohn Verwendung der explicit 'a
lifetime, zum Beispiel durch den Rückschluss auf eine unzulässige Zuordnung eines Verweises zu einem breiteren Geltungsbereich x = &f.x;
).
In welchen Fällen sind explizite Lebensdauern erforderlich, um Use-After-Free-Fehler (oder andere Klassenfehler?) Zu vermeiden?