irfo
Moderatör
- Katılım
- 7 Ocak 2026
- Mesajlar
- 290
- Tepkime puanı
- 2
- Puanları
- 18
Rust'ta Akıllı İşaretçiler (Smart Pointers), sadece veri tutan yapılar değil, aynı zamanda bellek yönetimi ve erişim kurallarını kontrol eden özel araçlardır. Bu araçların sihirli güçleri, iki kritik trait'ten gelir:
Bu trait'ler sayesinde kendi akıllı işaretçilerinizi yazabilir ve Rust'ın sahiplik sistemini esnetebilirsiniz.
Rust
3. Manuel Drop ve
Bazen bir değişkenin kapsam sonunu beklemeden onu bellekten silmek isteyebilirsiniz. Ancak
Rust
Deref ve Drop.Bu trait'ler sayesinde kendi akıllı işaretçilerinizi yazabilir ve Rust'ın sahiplik sistemini esnetebilirsiniz.
1. Deref Trait: Referans Gibi Davranma
Deref trait'i, bir nesneyi "dereference" operatörü (*) ile kullanmanıza olanak tanır. Ayrıca "Deref Coercion" (Deref Zorlaması) denen harika bir özelliği devreye sokar.Neden İhtiyacımız Var?
BirBox<T> veya kendi yazdığınız bir akıllı işaretçiniz olduğunu düşünün. Eğer içinde bir String varsa, bu nesneyi doğrudan bir &str bekleyen fonksiyona göndermek istersiniz. Deref bunu otomatik yapar.Rust
Kod:
use std::ops::Deref;
struct BenimKutum<T>(T);
impl<T> Deref for BenimKutum<T> {
type Target = T;
fn deref(&self) -> &Self::Target {
&self.0
}
}
fn selamla(isim: &str) {
println!("Merhaba, {}!", isim);
}
fn main() {
let x = BenimKutum(String::from("Rust"));
// Deref sayesinde BenimKutum -> String -> &str dönüşümü yapılır
selamla(&x);
}
2. Drop Trait: Temizlik Zamanı
Drop trait'i, bir değişkenin kapsamı (scope) bittiğinde ne olacağını belirler. Rust, bellek temizliğini (deallocation) zaten otomatik yapar; ancak bazen ek işler yapmanız gerekir:- Bir dosyayı kapatmak.
- Bir ağ bağlantısını sonlandırmak.
- Bir veritabanı kilidini (lock) serbest bırakmak.
Kod:
struct DosyaYoneticisi {
isim: String,
}
impl Drop for DosyaYoneticisi {
fn drop(&mut self) {
println!("{} dosyası için kaynaklar temizleniyor...", self.isim);
}
}
fn main() {
let _d = DosyaYoneticisi { isim: String::from("veriler.txt") };
println!("Dosya oluşturuldu.");
} // <--- 'd' kapsam dışı kalır ve 'drop' metodu burada otomatik çağrılır.
3. Manuel Drop ve std::mem::drop
Bazen bir değişkenin kapsam sonunu beklemeden onu bellekten silmek isteyebilirsiniz. Ancak drop metodunu manuel olarak çağıramazsınız (d.drop() hata verir). Bunun yerine standart kütüphanedeki drop fonksiyonu kullanılır:Rust
Kod:
let d = DosyaYoneticisi { isim: String::from("hizli_temizlik.txt") };
drop(d); // Sahipliği alır ve hemen yok eder.
// println!("{:?}", d); // HATA! d artık yok.
4. Akıllı İşaretçi Mimarisi
Rust'taki popüler akıllı işaretçilerin bu trait'leri nasıl kullandığına bakalım:| Akıllı İşaretçi | Deref Kullanımı | Drop Kullanımı |
Box<T> | Yığındaki (stack) veriyi yığına (heap) yönlendirir. | Heap'teki veriyi temizler. |
String | &String'i &str olarak kullanmanızı sağlar. | Karakter dizisini bellekten siler. |
MutexGuard | Kilitli veriye erişim sağlar. | Kilit (lock) mekanizmasını serbest bırakır. |