Sobes.tech
Middle

Shared_ptr ile birlikte hangi gösterici kullanılır?

sobes.tech yapay zeka

AI'dan gelen yanıt

weak_ptr.

#include <memory>
#include <iostream>

int main() {
    auto shared = std::make_shared<int>(10); // Paylaşılan akış oluştur
    std::weak_ptr<int> weak = shared;      // shared_ptr'den weak_ptr oluştur

    if (auto locked = weak.lock()) {       // weak_ptr'den shared_ptr almaya çalış
        std::cout << "Değer: " << *locked << std::endl;
    } else {
        std::cout << "Nesne silindi." << std::endl;
    }

    shared.reset(); // shared_ptr'nin gösterdiği nesne silinir

    if (auto locked = weak.lock()) {       // Tekrar deneme, nesne zaten silindi
        std::cout << "Değer: " << *locked << std::endl;
    } else {
        std::cout << "Nesne silindi." << std::endl;
    }

    return 0;
}

weak_ptr ve shared_ptr birlikte kullanılarak döngüsel referanslar çözülür ve bellek sarkması önlenir, özellikle iki veya daha fazla shared_ptr tarafından yönetilen nesnelerin birbirine referans verdiği durumlarda, ve referans sayacı asla sıfıra ulaşmaz.

İşte weak_ptr'in temel özellikleri:

  • Referans sayacını artırmaz: weak_ptr, shared_ptr tarafından yönetilen nesneye "zayıf" bir referans tutar, ve nesnenin güçlü referans sayacını artırmaz.
  • Nesnenin yaşam döngüsü kontrolü: lock() metodu ile weak_ptr'den shared_ptr alınmaya çalışılır. Nesne hâlâ canlıysa, lock() geçerli bir shared_ptr döner; değilse, boş bir shared_ptr döner.
  • Doğrudan erişim yok: weak_ptr, * veya -> operatörleriyle nesnenin içeriğine doğrudan erişim sağlamaz. Erişim, yalnızca lock() çağrısından sonra mümkündür.

weak_ptr kullanımı, shared_ptr kullanan veri yapılarında referans döngülerini kırmak için standart bir yoldur, örneğin grafikler veya çift bağlı listeler gibi.