2015-08-12 16 views
6

Es gibt eine Vektorressource, die in Zeile 2 des folgenden Programms zugeordnet ist. Wenn das Programm endet, ist die Vektorressource nicht im Besitz. Wenn eine Ressource überhaupt nicht in Besitz ist, wann wird sie zurückgewonnen? Gibt es eine Erklärung unter Verwendung der Terminologie der Semantik und Lebensdauer von Rust-Besitzern, die einen Programmierer davon überzeugen könnte, dass diese Ressource tatsächlich zurückgewonnen wird?Wann wird der Speicher für eine Ressource zurückgewonnen, die nicht mehr im Besitz des Benutzers ist?

fn main() { 
    let mut v = vec![1,2]; 
    v = vec![3, 4]; 
} 

Antwort

7

wenn nicht [eine unowned Ressource] zurückgewonnen werden?

In Rust Hinsicht ein Element ist fallen gelassen, wenn es außerhalb des Gültigkeitsbereichs geht, die oft (aber nicht immer) mit dem Ende eines Blocks entspricht. Wenn es gelöscht wird, werden alle Ressourcen freigegeben, die Teil des Elements sind.

Ressourcen kann Speicher bedeuten, wie im Vektor Beispiel, aber es kann auch mit anderen Dingen wie einem Dateigriff oder einem Schloss entsprechen. Dies wird üblicherweise als Initialisierung der Ressourcenerfassung (RAII) bezeichnet.

einen Programmierer davon überzeugen, dass diese Ressource tatsächlich zurückgewonnen wird?

Sie können nie jemanden überzeugen, der wirklich nicht glauben will^_ ^. Sie können jedoch Drop selbst zu sehen, implementieren, wenn ein Element gelöscht wird: Das wird die Ausgabe

struct NoisyDrop(u8); 

impl Drop for NoisyDrop { 
    fn drop(&mut self) { 
     println!("Number {} being dropped", self.0); 
    } 
} 

fn main() { 
    println!("step 1"); 
    let mut nd = NoisyDrop(1); 
    println!("step 2"); 
    nd = NoisyDrop(2); 
    println!("step 3"); 
} 

haben

step 1 
step 2 
Number 1 being dropped 
step 3 
Number 2 being dropped 

Sie können sehen, dass die erste Variable fallen gelassen wird, wenn seine Bindung als Fassung Es gibt keine Möglichkeit mehr, zum NoisyDrop(1) Wert zu gelangen. Die zweite Variable wird gelöscht, wenn sie aufgrund der Methode endet.

Eigentum Semantik und Lebensdauern

dieses Beispiel vor:

fn main() { 
    let mut v = vec![1]; 
    v = vec![2]; 
} 

Konzeptionell könnte es als

fn main() { 
    { 
     let v = vec![1]; 
    } 
    { 
     v = vec![2]; 
    } 
} 

Und dieses Beispiel

0 geschrieben werden

kann neu geschrieben werden als

fn main() { 
    { 
     let v1 = vec![1]; 
     { 
      let v2 = vec![2]; 
     } 
    } 
} 

Diese Umschreibungen zeigen die Lebensdauer jeden Variablen. Immer wenn Sie eine Methode mit einem generischen Lebensdauerparameter aufrufen, wird die Lebensdauer des Blocks der konkrete Wert sein, der für das generische 'a ersetzt wird.