Ide dasar dari pengelolaan sumber daya (termasuk memori) dalam sebuah program, apapun strateginya, adalah bahwa sumber daya yang terkait dengan "objek" yang tidak terjangkau dapat diperoleh kembali. Di luar memori, sumber daya tersebut dapat berupa kunci mutex, pegangan file, soket, koneksi database ...
Bahasa dengan pengumpul sampah secara berkala memindai memori (dengan satu atau lain cara) untuk menemukan objek yang tidak digunakan, melepaskan sumber daya yang terkait dengannya, dan terakhir melepaskan memori yang digunakan oleh objek tersebut.
Rust tidak memiliki GC, bagaimana cara mengelolanya?
Rust memiliki kepemilikan. Dengan menggunakan sistem tipe affine , ia melacak variabel mana yang masih memegang sebuah objek dan, ketika variabel seperti itu keluar dari ruang lingkup, memanggil destruktornya. Anda dapat melihat sistem tipe affine berlaku cukup mudah:
fn main() {
let s: String = "Hello, World!".into();
let t = s;
println!("{}", s);
}
Hasil:
<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;
^
yang secara sempurna menggambarkan bahwa di setiap titik waktu, di tingkat bahasa, kepemilikan dilacak.
Kepemilikan ini bekerja secara rekursif: jika Anda memiliki Vec<String>
(yaitu, deretan string dinamis), maka masing String
- masing dimiliki Vec
olehnya sendiri yang dimiliki oleh variabel atau objek lain, dll ... jadi, ketika variabel keluar dari ruang lingkup, ia secara rekursif membebaskan semua sumber daya yang dimilikinya, bahkan secara tidak langsung. Dalam kasus Vec<String>
ini berarti:
- Melepaskan buffer memori yang terkait dengan masing-masing
String
- Melepaskan buffer memori yang terkait dengan buffer
Vec
itu sendiri
Dengan demikian, berkat pelacakan kepemilikan, masa pakai SEMUA objek program secara ketat terikat pada satu (atau beberapa) variabel fungsi, yang pada akhirnya akan keluar dari ruang lingkup (ketika blok tempat mereka berada berakhir).
Catatan: ini agak optimis, dengan menggunakan penghitungan referensi ( Rc
atau Arc
) dimungkinkan untuk membentuk siklus referensi dan dengan demikian menyebabkan kebocoran memori, dalam hal ini sumber daya yang terkait dengan siklus tersebut mungkin tidak akan pernah dirilis.