Ufak bir tanım verip örneklere geçelim, oldukça zor anlaşılan bir kavram örneklerle pekiştirmek daha oturaklı olur diye düşünüyorum. Bir sebepten ötürü artık geçerli olmayan(kendisiyle alakasız) bir alana işaret eden pointer’e Dangling Pointer denir. Gerçek hayattan örnek vermem gerekirse, bir otobüs düşünün ve tüm biletleri x şubesinden satılmış olsun. Y şubesi bu durumdan haberdar olmayıp biletleri tekrar satmak isterse yolcular otobüse geldiği zaman yolcuların bir kısmı koltuğunun dolu olduğu görecektir. Bu durum çeşitli problemler doğuracaktır.
int* ptr = nullptr;
ptr = new int;
*ptr = 4;
delete(ptr);
*ptr = 10;
cout << *ptr << endl;
Bir pointer oluşturuyorum ve en baştaki değerini Ram’de serseri gibi dolaşmasını istemediğimden null yapıyorum. Sonradan bu pointer’imin bellekte int kadar yani 4 byte’lık yer kaplayacağını söylüyorum ve değerine 4 atıyorum. İşim bittikten sonra ilgili pointeri daha önceki yazımda bahsettiğim Memory Leak olmasını istemediğimden ötürü siliyorum fakat bu pointeri sonradan kullanmak istersem “yazma erişimi ihlali” gibi bir hata alacağım. Bunun sebebi pointeri sildikten sonra işaret ettiği hücrenin işletim sistemine tekrardan kullanması için geri verilmesi. Artık o hücrede başka veriler var ve C++ bizi ilgilendirmeyen yasaklı bölgeye girdiğimizi anlayıp erişim engeli veriyor. Erişmek istediğim hücrede işletim sisteminin çok önemli bir verisi olabilir ve ben onu değiştirirsem bilgisayarın çökmesine varacak hatalarla karşılaşabilirim. Bu tarz durumları önlemek için erişim engeli koyulmuştur.
int* ptr = nullptr;
int* ptr2 = nullptr;
ptr = new int;
*ptr = 10;
ptr2 = ptr;
delete(ptr);
*ptr2 = 25;
cout << *ptr2;
Bu örnekte de aynı durum geçerli. ptr’yi sildikten sonra ptr2 bu işlemden haberi olmayarak halen işletim sistemine geri verilen hücreyi gösteriyor. ptr2 üzerinden bir işlem yapmak istersem benzer bir şekilde hata alacağım ve erişimim kısıtlanacak. Son bir örnek vermek istiyorum;
int* p = f();
*p = 0;
int* f ()
{
int fv = 42; return &fv;
}
Aşağıdaki kod gösterici dönen f’i çağırır, sonucu bir gösterici değişkene koyar, sonra bunu değiştirmeye çalışır. Fakat göstericinin gösterdiği fv f’nin içinde tanımlıdır, f’nin yaşamı bitince onun bellekte kullandığı yer de iade edilmiştir, bu şekilde kullanılması beklenmedik sonuçlar doğurur.
Umarım anlatabilmişimdir, eğer herhangi bir sorununuz olursa yorumlara yazabilirsiniz.