Plazma sayı 8, sayfa 39

Bu sayfadaki yazılar

Sayfanın metni

Sayfa 39

İşte shared_ptr'ler böyle döngüsel kullanıma uygun olmadıkları için bu durumlarda döngüleri kırmak için weak_ptr adı verilen boost işaretçilerini kullanıyoruz.

Weak_ptr

Weak pointer ile bir veya birkaç shared_ptr'nin baktığı bir nesneye bakan bir işaretçi elde edebiliyoruz. Fakat bu işaretçi shared_ptr'lerin referans sayacını artırmıyor. Örneğin:

void (| boost::shared ptr<int> plnew int(5)); boost::weak ptr<int> d(p);

)

Burada g adlı weak_ptr yaratıldığı anda hala p işaretçisi nesnenin tek sahibi. Eğer p'nin kapsamından çıkarsak, p yok olduğu anda nesne de silinecek.

Peki weak_ptr'nin normal bir işaretçiden ne farkı var o zaman? Farkı şu, weak_ptr, normal işaretçiler veya shared_ptr gibi -> operatörünü desteklemiyor. Yani şöyle bir kod yazamıyoruz.

g'nun gösterdiği nesneyi kullanmanın tek yolu var o da g'dan geçici bir shared_ptr yaratmak.

boost::shared ptr<int> r - g.lock(); r>>hodol);

Eğer bu anda p ölmüş ve nesne yok olmuş ise lock() metodu null döndürecek. Dolayısıyla weak_ptr böylelikle aynı nesneye bakan işaretçilerden biri delete ile nesneyi sildiğinde diğer işaretçilerin anlamsız bir adrese bakmaları problemini (“dangling pointer” diye de bilinir) çözmüş oluyor. Aynı zamanda yukarıda bahsettiğimiz, shared_ptr'ler ile oluşan döngüsel sızıntı problemini de çözüyor.

Sonuç

Akıllı işaretçiler doğru kullanmayı öğrendiğinizde çok işinize yarayabilecek araçlardır. Bol bol kurcalamanız tavsiye olunur.

Klavyeyle gezinmek için ← ve → tuşları.