Stratejisi ne olursa olsun, bir programdaki kaynakları (bellek dahil) yönetmenin temel fikri, ulaşılamayan "nesnelere" bağlı kaynakların geri kazanılabilmesidir. Belleğin ötesinde, bu kaynaklar muteks kilitler, dosya tanıtıcıları, soketler, veritabanı bağlantıları olabilir ...
Çöp toplayıcıya sahip diller, kullanılmayan nesneleri bulmak, bunlarla ilişkili kaynakları serbest bırakmak ve son olarak bu nesneler tarafından kullanılan belleği serbest bırakmak için belleği (öyle veya böyle) düzenli aralıklarla tarar.
Rust'un GC'si yok, nasıl yönetiyor?
Rust'un mülkiyeti var. Afin tipi bir sistem kullanarak , hangi değişkenin hala bir nesneyi tuttuğunu izler ve bu tür bir değişken kapsam dışına çıktığında yıkıcısını çağırır. Afin tip sistemin etkili olduğunu oldukça kolay görebilirsiniz:
fn main() {
let s: String = "Hello, World!".into();
let t = s;
println!("{}", s);
}
Getiri:
<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;
^
bu, herhangi bir zamanda, dil düzeyinde, sahipliğin izlendiğini mükemmel bir şekilde göstermektedir.
Bu sahiplik özyinelemeli olarak çalışır: eğer bir Vec<String>
(yani dinamik dizeler dizisine) sahipseniz , o zaman her String
biri Vec
bir değişkene veya başka bir nesneye vb. Sahip olunur ... dolayısıyla, bir değişken kapsam dışına çıktığında, dolaylı da olsa sahip olduğu tüm kaynakları yinelemeli olarak serbest bırakır. Bu durumda Vec<String>
şu anlama gelir:
- Her biri ile ilişkili bellek arabelleğini serbest bırakma
String
Vec
Kendisiyle ilişkili bellek tamponunu serbest bırakmak
Bu nedenle, sahiplik izleme sayesinde, TÜM program nesnelerinin yaşam süresi bir (veya birkaç) işlev değişkenine sıkı sıkıya bağlıdır ve sonuçta kapsam dışına çıkacaktır (blok sona ait olduğunda).
Not: Bu biraz iyimserdir, referans sayma ( Rc
veya Arc
) kullanarak referans döngüleri oluşturmak ve dolayısıyla bellek sızıntılarına neden olmak mümkündür, bu durumda döngüye bağlı kaynaklar asla serbest bırakılmayabilir.