Podstawowa idea zarządzania zasobami (w tym pamięcią) w programie, bez względu na strategię, polega na tym, że zasoby powiązane z nieosiągalnymi „obiektami” mogą zostać odzyskane. Oprócz pamięci, te zasoby mogą być blokadami mutex, uchwytami plików, gniazdami, połączeniami z bazą danych ...
Języki z modułem odśmiecania pamięci okresowo skanują pamięć (w ten czy inny sposób) w celu znalezienia nieużywanych obiektów, zwalniania zasobów z nimi powiązanych i wreszcie zwalniania pamięci używanej przez te obiekty.
Rust nie ma GC, jak sobie z tym radzi?
Rust ma własność. Korzystając z systemu typu afinicznego , śledzi, która zmienna wciąż trzyma obiekt, a gdy taka zmienna wychodzi poza zakres, wywołuje jej destruktor. Możesz łatwo zobaczyć działający system typów afinicznych:
fn main() {
let s: String = "Hello, World!".into();
let t = s;
println!("{}", s);
}
Plony:
<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;
^
co doskonale ilustruje, że w dowolnym momencie, na poziomie języka, własność jest śledzona.
Ta własność działa rekurencyjnie: jeśli masz a Vec<String>
(tj. Dynamiczną tablicę ciągów), to każda String
z Vec
nich jest własnością zmiennej lub innego obiektu, itd ... tak więc, gdy zmienna wykracza poza zakres, rekurencyjnie zwalnia wszystkie posiadane zasoby, nawet pośrednio. W przypadku Vec<String>
tego oznacza:
- Zwolnienie bufora pamięci związanego z każdym
String
- Zwolnienie bufora pamięci skojarzonego z samym
Vec
sobą
W ten sposób, dzięki śledzeniu własności, czas życia WSZYSTKICH obiektów programu jest ściśle powiązany z jedną (lub kilkoma) zmiennymi funkcyjnymi, które ostatecznie wyjdą poza zakres (kiedy kończy się blok, do którego należą).
Uwaga: jest to nieco optymistyczne, używając liczenia referencji ( Rc
lub Arc
) można tworzyć cykle odwołań i w ten sposób powodować wycieki pamięci, w którym to przypadku zasoby powiązane z cyklem mogą nigdy nie zostać zwolnione.