Sobes.tech
Middle
767

C++'ta shared_ptr nasıl çalışır?

AI'dan gelen yanıt

sobes.tech yapay zeka

shared_ptr — paylaşılan kaynağın sahiplik semantiğini uygulayan akıllı bir göstericidir. Nesneye işaret eden bir gösterici ve kontrol bloğuna işaret eden bir gösterici tutar.

Kontrol bloğu şunları içerir:

  • Güçlü referans sayacı (reference count).
  • Zayıf referans sayacı (weak count).
  • Kullanıcı tanımlı silici (deleter), belirtilmişse.
  • Kullanıcı tanımlı ayırıcı, belirtilmişse.
  • Saklanan nesneye işaretçi (aynı zamanda shared_ptr içinde saklanan).

Çalışma prensibi:

  1. Oluşum: İlk shared_ptr nesnesi oluşturulduğunda, kontrol bloğu oluşturulur ve referans sayıcılar başlatılır: güçlü — 1, zayıf — 0.
    std::shared_ptr<int> ptr1 = std::make_shared<int>(10); // Bir int nesnesi ve kontrol bloğu oluşturur
    
  2. Kopyalama: Bir shared_ptr kopyalandığında, kontrol bloğundaki güçlü referans sayacı 1 artar.
    std::shared_ptr<int> ptr2 = ptr1; // Güçlü referans sayacını artırır
    
  3. Atama: Bir shared_ptr atandığında, eski kaynak azaltılır (güçlü referans sayısı düşer), yeni kaynak artırılır (arttırılır).
    std::shared_ptr<int> ptr3;
    ptr3 = ptr1; // ptr3'ün eski kaynağını azaltır, ptr1'in kaynağını artırır
    
  4. Silme: Bir shared_ptr yok edildiğinde (örneğin, kapsam dışına çıkıldığında), güçlü referans sayacı azaltılır.
    {
        std::shared_ptr<int> ptr4 = ptr1; // Güçlü referans sayacını artırır
        // ptr4 kapsam dışına çıkar
    } // Güçlü referans sayacını azaltır
    
  5. Kaynağın serbest bırakılması: Güçlü referans sayacı sıfıra ulaştığında, kaynak (shared_ptr'in gösterdiği nesne) silinir, belirtilen silici kullanılarak (veya varsayılan delete).
  6. Kontrol bloğunun serbest bırakılması: Her iki sayaç (güçlü ve zayıf) sıfıra ulaştığında kontrol bloğu serbest bırakılır.

Avantajlar:

  • Paylaşılan kaynaklar için otomatik bellek yönetimi.
  • Çift serbest bırakmaya karşı güvenlik.
  • Kullanıcı tanımlı silici fonksiyonları desteği.

Dezavantajlar:

  • Döngüsel referanslar bellek sızıntılarına yol açabilir (weak_ptr ile çözülür).
  • Kontrol bloğu ve atomik işlemler nedeniyle küçük ek maliyet.
  • Kendine ait shared_ptr ile yapılan işlemlerde (kopyalama, atama, gösterici değiştirme) güvenlik, gösterdiği nesneyle ilgili değildir.