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_ptroluşturulduğunda artar. Birshared_ptryok 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_ptriçin kullanılır. Birweak_ptrshared_ptr'den oluşturulduğunda artar. Birweak_ptryok 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.