Die Grundidee beim Verwalten von Ressourcen (einschließlich Speicher) in einem Programm, unabhängig von der Strategie, besteht darin, dass die an nicht erreichbare "Objekte" gebundenen Ressourcen zurückgefordert werden können. Über den Speicher hinaus können diese Ressourcen Mutex-Sperren, Dateihandles, Sockets, Datenbankverbindungen ... sein.
Sprachen mit einem Garbage Collector durchsuchen den Speicher regelmäßig (auf die eine oder andere Weise), um nicht verwendete Objekte zu finden, die damit verbundenen Ressourcen freizugeben und schließlich den von diesen Objekten verwendeten Speicher freizugeben.
Rust hat keinen GC, wie geht das?
Rust hat Eigentum. Unter Verwendung eines affinen Typsystems verfolgt es, welche Variable noch an einem Objekt festhält, und ruft ihren Destruktor auf, wenn eine solche Variable den Gültigkeitsbereich verlässt. Sie können das affine Typsystem ziemlich leicht erkennen:
fn main() {
let s: String = "Hello, World!".into();
let t = s;
println!("{}", s);
}
Ausbeuten:
<anon>:4:24: 4:25 error: use of moved value: `s` [E0382]
<anon>:4 println!("{}", s);
<anon>:3:13: 3:14 note: `s` moved here because it has type `collections::string::String`, which is moved by default
<anon>:3 let t = s;
^
Dies zeigt perfekt, dass zu jedem Zeitpunkt auf Sprachebene der Besitz nachverfolgt wird.
Dieser Besitz funktioniert rekursiv: Wenn Sie einen Vec<String>(dh ein dynamisches Array von Zeichenfolgen) haben, gehört jeder Stringdem, Vecder selbst einer Variablen oder einem anderen Objekt gehört, usw. Wenn eine Variable den Gültigkeitsbereich verlässt, es setzt rekursiv alle Ressourcen frei, die es besaß, auch indirekt. Im Falle der Vec<String>bedeutet dies:
- Freigeben des jedem zugeordneten Speicherpuffers
String
- Freigeben des dem
Vecselbst zugeordneten Speicherpuffers
Dank der Besitzverfolgung ist die Lebensdauer ALLER Programmobjekte streng an eine (oder mehrere) Funktionsvariablen gebunden, die letztendlich den Gültigkeitsbereich verlassen (wenn der Block, zu dem sie gehören, endet).
Hinweis: Dies ist etwas optimistisch, da durch Referenzzählung ( Rcoder Arc) Referenzzyklen gebildet werden können und somit Speicherlecks verursacht werden. In diesem Fall werden die an den Zyklus gebundenen Ressourcen möglicherweise nie freigegeben.