Deref & Drop: Akıllı İşaretçilerin Davranışlarını Özelleştirme

  • Konbuyu başlatan Konbuyu başlatan irfo
  • Başlangıç tarihi Başlangıç tarihi

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: 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?​

Bir Box<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.
Rust
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çiDeref 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.
MutexGuardKilitli veriye erişim sağlar.Kilit (lock) mekanizmasını serbest bırakır.
 
Geri
Üst