CodeBlanks Logo Icon CodeBlanks

std::weak_ptr

std::weak_ptr ile döngüsel referansı önlemeyi öğrenirsin.

std::weak_ptr

std::weak_ptr bir shared_ptr'in zayıf (sahip olmayan) gözlemcisidir. Referans sayacını artırmadan bir nesneye bakabilir. shared_ptr'den weak_ptr oluşturursun: std::weak_ptr<int> wp = sp;.

weak_ptr'nin amacı döngüsel referansları kırmasıdır. İki nesne birbirine shared_ptr ile bağlıysa hiçbiri silinmez (sayac asla 0'a inmez). Bir taraf weak_ptr kullanırsa döngü kırılır. weak_ptr doğrudan dereference edilemez; önce lock() ile bir shared_ptr alırsın. Nesne hala yaşıyorsa geçerli bir işaretçi, silindiyse boş işaretçi döner.

lock() ile erişim

weak_ptr doğrudan * ile dereference edilemez. Bunun yerine lock() metodu bir shared_ptr döndürür: auto p = wp.lock();. Nesne yaşıyorsa p geçerli, silindiyse boş olur.

Örnek: if (auto p = wp.lock()) { std::cout << *p; }. Burada lock() başarılıysa p geçerli bir shared_ptr'dir ve *p ile değere erişirsin. Başarısızsa p boştur ve if koşulu yanlış olur. Bu, weak_ptr'in güvenli kullanım şeklidir; nesnenin yaşam süresini kontrol etmeden erişmezsin.

Uygulama weak_ptr ile güvenli erişim

sp adında std::make_shared<int>(99) ile bir shared_ptr zaten tanımlı. std::weak_ptr<int> wp = sp; ile zayıf gözlemci oluştur. if (auto p = wp.lock()) ile güvenli eriş ve *p'yi std::cout ile yazdır.

Başlangıç kodu

main.cpp
#include <iostream>
#include <memory>

int main() {
    std::shared_ptr<int> sp = std::make_shared<int>(99);
    // weak_ptr oluştur sp'den, lock ile eriş ve yazdır
    return 0;
}

Örnek çözüm

main.cpp
#include <iostream>
#include <memory>

int main() {
    std::shared_ptr<int> sp = std::make_shared<int>(99);
    std::weak_ptr<int> wp = sp;
    if (auto p = wp.lock()) {
        std::cout << *p;
    }
    return 0;
}

Beklenen çıktı

99

Soru ve cevaplar

Dersin sorularını cevaplarıyla birlikte inceleyebilirsin. Kendini denemek istersen dersi interaktif olarak çöz.

1 Özelliği anlamıyla eşle

Kavram Anlamı
std::weak_ptr Zayıf gözlemci
wp.lock() shared_ptr al
Döngüsel referans Sızıntı kaynağı
Referans sayacı Artmaz

2 weak_ptr tanımla

Soru
std::____<int> wp = sp;
Cevap
std::weak_ptr<int> wp = sp;

Açıklama: weak_ptr zayıf gözlemci sağlar.

3 weak_ptr hangi sorunu önler?

main.cpp
// iki nesne birbirine shared_ptr ile bagli
// biri weak_ptr kullanirsa
  • Bellek taşmasını
  • Döngüsel referans sızıntısını Doğru cevap
  • Null işaretçiyi
  • Derleme hatasını

Açıklama: weak_ptr döngüsel referansları kırarak sızıntıyı önler.

Orta seviye bölümündeki tüm dersler