EMZETT.
Login

Rust: Ownership und Borrowing – sicherer Speicher ohne Garbage Collector

Kurz: Rust verwaltet Speicher über Besitzregeln, die der Compiler prüft: Jeder Wert hat genau einen Besitzer, Ausleihen sind kontrolliert, und so entstehen weder Speicherlecks noch Zugriffsfehler.

Genauer: In C und C++ kann man Speicher doppelt freigeben oder nach der Freigabe lesen (use-after-free). Andere Sprachen nutzen einen Garbage Collector (Java, Go, Python). Rust löst das zur Kompilierzeit mit Ownership, Borrowing und Lifetimes: Fehler werden vor dem Start gefunden, ohne Laufzeitkosten.

Im Detail

Die drei Regeln

  1. Jeder Wert hat einen Besitzer (eine Variable).
  2. Es kann zu einem Zeitpunkt nur einen Besitzer geben.
  3. Verlässt der Besitzer den Gültigkeitsbereich, wird der Wert freigegeben.
let a = String::from("Hallo");
let b = a;              // Besitz wandert zu b („move“)
// println!("{}", a);   // Fehler: a ist nicht mehr gültig
println!("{}", b);

Kopien sind explizit (b = a.clone()); einfache Werte wie Zahlen werden kopiert (Copy).

Borrowing: Ausleihen mit Referenzen

Statt Besitz zu übergeben, leiht man aus:

fn laenge(s: &String) -> usize { s.len() }   // unveränderliche Referenz
fn anhaengen(s: &mut String) { s.push('!'); } // veränderliche Referenz

Regel: Entweder beliebig viele lesende (&T) oder genau eine schreibende Referenz (&mut T) gleichzeitig. Das verhindert Datenwettläufe und unerwartete Änderungen. Der Borrow Checker des Compilers prüft das.

Lifetimes

Eine Referenz darf nicht länger leben als der Wert, auf den sie zeigt. Meist erkennt der Compiler das; manchmal braucht er Hinweise ('a):

fn laengerer<'a>(a: &'a str, b: &'a str) -> &'a str {
    if a.len() > b.len() { a } else { b }
}

So gibt es keine hängenden Zeiger (dangling pointers).

Einordnung und Lernen

Vorteile: Speichersicherheit ohne GC, hohe Leistung, sichere Nebenläufigkeit. Nachteile: steile Lernkurve, der Compiler „kämpft“ anfangs mit dir, für Prototypen teils umständlich. Tipps: Fehlermeldungen genau lesen (sie sind sehr hilfreich), mit Klonen und Rc/Arc beginnen, kleine Programme schreiben, das Buch „The Rust Programming Language“ und Rustlings-Übungen nutzen. Mit Rust entstehen sichere Systemprogramme, Webdienste (Axum), WebAssembly und Werkzeuge (ripgrep).

Siehe auch: Ownership, Stack und Heap, Garbage-Collection-Verfahren, Speicherleck, Rust