Dangling Pointer ve Memory Leak: Bellek Sızıntılarını Nasıl Önleriz?

crazy_coder

Moderatör
Katılım
20 Şub 2026
Mesajlar
204
Tepkime puanı
0
Puanları
16

Bellek Yönetiminin İki Büyük Kabusu​


Kod yazarken "ödünç aldığımız" belleği nasıl geri verdiğimiz veya veremediğimiz, uygulamanın sağlığını belirler. İşte bu sürecin hatalı yönetilmesiyle ortaya çıkan iki ana problem:



1. Memory Leak (Bellek Sızıntısı) Nedir?​


Programın new veya malloc ile heap üzerinden yer ayırması, ancak işi bittikten sonra bu alanı delete veya free ile sisteme iade etmemesidir. Bu durum, program çalıştığı sürece RAM kullanımının sürekli artmasına neden olur.

Sızıntı Örneği:
C++:
void VeriIsle() {
int* liste = new int[1000]; // 4000 byte yer ayrıldı
// ... işlemler yapıldı ...
return; // HATA: 'delete[] liste' yapılmadan fonksiyondan çıkıldı!
}
Sonuç: Fonksiyon her çağrıldığında 4KB bellek "kaybolur". Binlerce kez çağrıldığında uygulama "Out of Memory" hatasıyla çöker.



2. Dangling Pointer (Sarkan Gösterici) Nedir?​


Bir pointer'ın gösterdiği bellek alanının serbest bırakılmasına (delete) rağmen, pointer'ın hala o adresi göstermeye devam etmesi durumudur. Bu pointer üzerinden belleğe erişmeye çalışmak, tanımsız davranışlara (Undefined Behavior) yol açar.

Tehlike Örneği:
C++:
int* ptr = new int(10);
delete ptr; // Bellek iade edildi

// ptr hala eski adresi tutuyor (Dangling Pointer)
*ptr = 20; // KRİTİK HATA: Artık bize ait olmayan bir yere yazmaya çalışıyoruz!



3. Bu Hataları Nasıl Önleriz?​


YöntemAçıklama
nullptr AtamasıBir nesneyi delete ettikten hemen sonra pointer'ı nullptr yapın. Böylece yanlışlıkla erişimi engellersiniz.
RAII PrensibiBellek yönetimini sınıfların constructor ve destructor yapılarına bırakın.
Smart PointersModern C++ ile gelen unique_ptr veya shared_ptr kullanarak delete işlemini otomatize edin.
Valgrind / LeakSanitizerDerleme sonrası bellek kaçaklarını tarayan analiz araçları kullanın.



4. Modern Çözüm: Akıllı İşaretçiler (Smart Pointers)​


C++11 ile hayatımıza giren akıllı işaretçiler, kapsam (scope) dışına çıkıldığında belleği otomatik olarak iade eder.

C++:
#include <memory>

void GuvenliIslem() {
std::unique_ptr<int> ptr = std::make_unique<int>(10);
// ... işlemler ...
} // ptr burada otomatik olarak 'delete' edilir. Sızıntı riski sıfır!



Sonuç​


Memory leak ve dangling pointer hataları, profesyonel bir yazılımın en büyük düşmanlarıdır. Manuel bellek yönetimi (new/delete) yaparken her zaman disiplinli olmalı veya modern C++'ın sunduğu akıllı işaretçilerin gücünden yararlanmalısınız. Unutmayın; iyi bir programcı yazdığı kodun ne kadar RAM harcadığını her zaman bilir.
 
Geri
Üst