Sahiplik sistemi (ownership), Rust'ın derleme zamanında bellek güvenliğini sağlamak için temel bir kavramdır. Her değişkenin bir sahibi vardır. Belirli bir anda sadece bir kaynak sahibi olabilir.
Sahiplik, atama veya bir fonksiyona geçirilirken (move) aktarılır. Aktarıldıktan sonra, önceki sahibi artık değeri kullanamaz:
let s = String::from("hello"); let t = s; // s artık kullanılamaz
Rust ayrıca ödünç alma (reference) kavramını ayırır.
&T — yalnızca okuma için referans (borrow).&mut T — değiştirilebilir referans (mutable borrow), ancak bir yaşam süresinde yalnızca bir tane olabilir.Bu kurallar sayesinde Rust, belleğin serbest bırakılmasından sonra kullanılmaya çalışılan veri yarışlarının ve diğer kaynak yönetimi hatalarının oluşmayacağını garanti eder.
Bir değerin daha fazla bir değiştirilebilir referansı (&mut T) olabilir mi? Neden?
Cevap: Hayır, her an yalnızca bir değiştirilebilir referans veya herhangi sayıda değiştirilemeyen referans olabilir. Bu, veri yarışlarını önler. Yanlış kod örneği:
let mut s = String::from("hi"); let r1 = &mut s; let r2 = &mut s; // Derleme hatası!
Hikaye
Bir çoklu iş parçacıklı projede, geliştirici sahiplik kullanmadan bir değişkenin referanslarını depolamaya çalıştı ve bu, referans tamamlanmadan önce serbest bırakıldığında (use-after-free) çökmelere neden oldu. Rust böyle bir kodun derlenmesine izin vermedi, bu nedenle mimariyi değiştirmek zorunda kaldılar.
Hikaye
Büyük bir Rust projesinin başlangıcında, programcılar kodu C++'dan taşımaya çalıştılar. Eski alışkanlıklarını "ham" işaretçilerle birleştirmeye çalıştılar ve bu da kaynak sahipliği hatalarına ve borrow checker'ın sürekli panik yapmasına neden oldu, ta ki sahiplik mimarisi ile ilgili sorun çözülene kadar.
Hikaye
Bir dize ayrıştırma kütüphanesinde, çift serbest bırakma bellek hatalarından sadece Rust'ın katı sahiplik sistemi sayesinde kaçınıldı. C++'da benzer bir kütüphane, zor bulunan hatalara ve bellek sızıntılarına yol açıyordu.