Zum Inhalt springen

Ownership

Betrachten Sie das folgende Programm, das den Speicherzustand nach der letzten Zeile zeigt:

fn main() {
let x = Box::new(0);
let y = Box::new(&x);`[]`
}

Wenn Sie die Zahl 0 über y kopieren möchten, wie viele Dereferenzierungen müssten Sie verwenden? Geben Sie Ihre Antwort als Ziffer an. Wenn der korrekte Ausdruck beispielsweise *y ist, lautet die Antwort 1.

***y ist der korrekte Ausdruck. y hat den Typ Box<&Box<i32>>. Es ist ein Heap-Zeiger auf eine Stack-Referenz auf einen Heap-Zeiger. Daher muss y dreimal dereferenziert werden, einmal für jede Indirektionsebene.


Betrachten Sie das folgende Programm, das den Speicherzustand nach der letzten Zeile zeigt:

fn get_first(vr: &Vec<i32>) -> i32 {
vr[0]
}
fn main() {
let mut v = vec![0, 1, 2];
let n = get_first(&v);
println!("{} {}", n, v[1]);`[]`
}

Welche der folgenden Aussagen erklärt am besten, warum v nach dem Aufruf von get_first nicht deallokiert wird?

Referenzen sind nicht-besitzende Zeiger. Daher wird durch die Übergabe von &v an get_first die Ownership von v nicht in get_first verschoben, und folglich wird v nach Beendigung von get_first nicht deallokiert.