Sobes.tech
Middle

Hangi temel üzerine birkaç shared_ptr nesnesi aynı göstericiye referans verebilir?

sobes.tech yapay zeka

AI'dan gelen yanıt

Birden fazla std::shared_ptr nesnesi, kontrol bloğu (control block) sayesinde aynı göstericiye referans verebilir.

İlgili nesneyle bağlantılı kontrol bloğu şunları içerir:

  • Güçlü referans sayacı (strong reference count): Aynı nesne için yeni bir shared_ptr oluşturulduğunda artar. Bir shared_ptr yok edildiğinde azalır. Sıfıra ulaştığında, ilişkili nesne (gösterici) silinir.
  • Zayıf referans sayacı (weak reference count): std::weak_ptr için kullanılır. Bir weak_ptr shared_ptr'den oluşturulduğunda artar. Bir weak_ptr yok edildiğinde azalır. Her iki sayaç da sıfıra ulaştığında, kontrol bloğu silinir.
  • Yönetilen nesneye ait kendi gösterici: Veri göstericisi değil, kontrol bloğu tarafından yönetilen gösterici.

Mevcut bir shared_ptr'den yeni bir shared_ptr oluşturduğunuzda (kopyalama, atama-kopyalama), her ikisi de aynı kontrol bloğunu kullanmaya başlar ve bu bloğun güçlü referans sayacı artar.

Örnek:

#include <memory>
#include <iostream>

struct MyData {
    int value;
    MyData(int v) : value(v) { std::cout << "MyData(" << value << ") oluşturuldu.\n"; }
    ~MyData() { std::cout << "MyData(" << value << ") yok edildi.\n"; }
};

int main() {
    // İlk shared_ptr oluşturulur.
    // Kontrol bloğu ve MyData nesnesi oluşturulur.
    // Sayaçlar: güçlü: 1, zayıf: 0.
    std::shared_ptr<MyData> ptr1 = std::make_shared<MyData>(10);
    std::cout << "ptr1 kullanım sayısı: " << ptr1.use_count() << "\n";

    // ptr1'den ikinci bir shared_ptr oluşturulur.
    // Aynı kontrol bloğu kullanılır.
    // Güçlü sayaç 2'ye çıkar.
    std::shared_ptr<MyData> ptr2 = ptr1;
    std::cout << "ptr1 kullanım sayısı: " << ptr1.use_count() << "\n";
    std::cout << "ptr2 kullanım sayısı: " << ptr2.use_count() << "\n";

    // ptr1'den üçüncü bir shared_ptr oluşturulur.
    // Aynı kontrol bloğu kullanılır.
    // Güçlü sayaç 3'e çıkar.
    std::shared_ptr<MyData> ptr3 = ptr1;
     std::cout << "ptr1 kullanım sayısı: " << ptr1.use_count() << "\n";
    std::cout << "ptr2 kullanım sayısı: " << ptr2.use_count() << "\n";
    std::cout << "ptr3 kullanım sayısı: " << ptr3.use_count() << "\n";

    std::cout << "Kapsam dışına çıkılıyor.\n";
    // ptr3 kapsam dışına çıkar.
    // Güçlü sayaç 2'ye düşer.
    // ptr2 kapsam dışına çıkar.
    // Güçlü sayaç 1'e düşer.
    // ptr1 kapsam dışına çıkar.
    // Güçlü sayaç 0'a düşer.
    // MyData nesnesi yok edilir.
    // Kontrol bloğu yok edilir.
}

Her shared_ptr nesnesi, kendi kontrol bloğu göstericisine ve kendi veri nesnesi göstericisine sahiptir. Bir shared_ptr kopyalandığında, her iki gösterici de kopyalanır ve ortak kontrol bloğundaki güçlü referans sayacı artırılır. Bu şekilde, tüm shared_ptr nesneleri aynı kontrol bloğuna işaret eder ve bu blok, sahip olunan kopya sayısını izler ve yönetilen kaynağın yok edilme zamanını belirler.