std::weak_ptr
- C++ kursu
- Orta seviye
- Ders 84/116
- 5 dk
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
#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
#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
std::____<int> wp = sp;
std::weak_ptr<int> wp = sp;
Açıklama: weak_ptr zayıf gözlemci sağlar.
3 weak_ptr hangi sorunu önler?
// 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.