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_ptriçinde saklanan).
Çalışma prensibi:
- Oluşum: İlk
shared_ptrnesnesi 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 - Kopyalama: Bir
shared_ptrkopyalandığında, kontrol bloğundaki güçlü referans sayacı 1 artar.std::shared_ptr<int> ptr2 = ptr1; // Güçlü referans sayacını artırır - Atama: Bir
shared_ptratandığı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 - Silme: Bir
shared_ptryok 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 - 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ılandelete). - 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_ptrile çözülür). - Kontrol bloğu ve atomik işlemler nedeniyle küçük ek maliyet.
- Kendine ait
shared_ptrile yapılan işlemlerde (kopyalama, atama, gösterici değiştirme) güvenlik, gösterdiği nesneyle ilgili değildir.