RAII (Kaynak Edinimi, Başlatmadır) — C++'dan gelen bir idiomdur; burada, bir kaynağın ömrü, yığındaki nesnenin ömrüyle sıkı bir şekilde bağlantılıdır. Rust'ta bu kavram, kaynakların sahipliği ve serbest bırakılma sisteminin temeline yerleşmiş olup, klasik çöp toplayıcıların (GC) kullanılmadan geçmesini sağlar.
Birçok dil, belleği ve kaynakları, gereksiz nesneleri periyodik olarak "temizleyen" bir çöp toplayıcı aracılığıyla yönetir. Bu strateji gecikmeleri artırır ve dış kaynakların (dosyalar, soketler vb.) anında serbest bırakılması konusunda garanti vermez. Düşük seviyeli ve sistem programlamada bu tür bir durum kabul edilemez: kaynak yönetiminde kesinlik ve belirlenebilirlik gerekir.
Rust'ta her nesne kendi kaynağına sahiptir ve bu kaynağı kesin olarak yok olma yerinde serbest bırakır (out of scope), Drop çağrısı ile (bir yıkıcıya benzer). Sonuç olarak, kaynaklar hemen serbest bırakılır ve dolaylı serbest bırakma hataları en aza indirilir. Rust’ın tür ve sahiplik sistemi, bellekte sızıntıları ve çift serbest bırakmaları neredeyse derleme aşamasında önler.
Kod örneği:
struct FileWrapper { file: std::fs::File, } impl Drop for FileWrapper { fn drop(&mut self) { println!("FileWrapper dosyayı kapatıyor! (scope exit)"); } } fn main() { let _fw = FileWrapper { file: std::fs::File::create("test.txt").unwrap() }; // main'den çıkıldığında, drop kesinlikle çağrılır }
Anahtar özellikler:
Önceden taşınmış (moved) değerler için Drop çağrılır mı?
Hayır, değer taşındıktan sonra Drop yalnızca yeni sahibine çağrılır, eski nesne "boş" olarak kabul edilir ve Drop tetiklenmez.
let file1 = FileWrapper {...}; let file2 = file1; // file1 taşınır // Drop yalnızca file2 için bir kez çağrılacaktır
Kapsamın ortasında panic! veya unwrap() Drop çağrısını engelleyebilir mi?
Hayır, panik veya hata nedeniyle çıkış, yıkıcının çağrısını iptal etmez – Drop, kapsam dışına çıkmış tüm nesneler için mutlaka çağrılacaktır.
Eğer bir referans bir nesneye sahip oluyorsa, referansın ömrü sona erdiğinde drop çağrılır mı?
Hayır, drop yalnızca nesnenin sahibine çağrılır, referanslar sahiplik sağlamaz. Yığın (heap) kaynakları için akıllı işaretçi gereklidir.
Geliştirici, dosya tanımlayıcısını bir yazma fonksiyonuna referans olarak iletti. Programın çalışması tamamlandığında, dosyanın üzerinde bir kilit kaldı çünkü drop çağrılmadı (sahibi yok, referans kullanıldı).
Artılar:
Eksiler:
Kaynağın sahipliği her zaman Drop'ı uygulayan yapılar aracılığıyla aktarılmıştır. Tüm açık dosyalar, bağlantılar veya kilitler kapsam sona erdiğinde veya panic durumunda otomatik olarak serbest bırakılır. Karmaşık projelerde bile güvenli ve sıradan kaynak yönetimi üzerinde tam yetki sağlar.
Artılar:
Eksiler: