Yükleniyor...

Bellek Sızıntıları ve valgrind ile Analiz

Bellek sızıntılarını tespit etme, valgrind çıktıları ve tipik hata örüntüleri.

C++’ta dinamik bellek yönetimi geliştiriciye büyük esneklik sağlar, ancak bellek yanlış kullanıldığında bellek sızıntısı (memory leak) sorunları ortaya çıkar. Bellek sızıntısı, ayrılmış belleğin serbest bırakılmaması nedeniyle zamanla RAM’in dolmasına ve program performansının düşmesine yol açar. Bu makalede bellek sızıntısının ne olduğunu, nasıl tespit edileceğini ve Valgrind aracıyla nasıl analiz edileceğini öğreneceğiz.


1. Bellek Sızıntısı Nedir?

Bellek sızıntısı, new veya malloc ile ayrılmış bir bellek alanının delete veya free ile serbest bırakılmaması durumudur. Bu durumda bellek program kapanana kadar işgalde kalır, başka işlemler tarafından kullanılamaz.


#include <iostream>
using namespace std;

void SızıntıOlustur() {
    int *p = new int(42); // Dinamik bellek ayrıldı
    // delete p; // Unutuldu!
}

int main() {
    SızıntıOlustur();
    cout << "Program sona erdi." << endl;
}

Yukarıdaki örnekte p için ayrılan bellek, program bitene kadar RAM’de kalır. Program sonlansa bile bu bellek işletim sistemi tarafından geri alınmadan önce kaybolur. Bu tür durumlar özellikle uzun süre çalışan sunucu uygulamalarında ciddi problemlere yol açar.


2. Bellek Sızıntısının Sonuçları


3. Sızıntı Oluşturan Tipik Durumlar


void HatalıKod() {
    int *p = new int[5];
    p = new int[10]; // Eski adres kayboldu → 5 int’lik alan sızdırıldı
    delete[] p;
}

4. Bellek Sızıntısı Nasıl Önlenir?

Bellek sızıntılarını önlemek için bazı temel prensipler uygulanabilir:


#include <iostream>
#include <memory>
using namespace std;

void GuvenliKullanim() {
    auto ptr = make_unique<int>(99);
    cout << *ptr << endl;
} // ptr kapsamdan çıkınca otomatik silinir

Bu örnekte std::unique_ptr sayesinde manuel delete işlemine gerek kalmadan bellek otomatik olarak temizlenir.


5. Bellek Sızıntısı Tespiti (Valgrind)

Valgrind, Linux ortamında çalışan açık kaynaklı bir bellek analiz aracıdır. Programın çalışması sırasında ayrılan ve serbest bırakılan tüm bellek bloklarını izleyerek sızıntıları, hatalı erişimleri ve çifte serbest bırakmaları raporlar.

Kurulum (Ubuntu / Debian)


sudo apt update
sudo apt install valgrind

Kullanım

Programınızı derledikten sonra Valgrind ile şu şekilde çalıştırabilirsiniz:


g++ -g program.cpp -o program
valgrind --leak-check=full ./program

-g parametresi hata ayıklama sembollerini ekler, böylece Valgrind çıktısında satır numaraları görünür.


6. Valgrind Çıktısı Örneği

Diyelim ki aşağıdaki programda bir sızıntı var:


#include <iostream>
using namespace std;

int main() {
    int *p = new int[3];
    p[0] = 10;
    p[1] = 20;
    p[2] = 30;
    // delete[] p; // Unutuldu!
    return 0;
}

Valgrind çıktısı şöyle olur:


==1234== 12 bytes in 1 blocks are definitely lost in loss record 1 of 1
==1234==    at 0x4C2FB55: operator new[](unsigned long) (vg_replace_malloc.c:431)
==1234==    by 0x40065A: main (program.cpp:5)
==1234== LEAK SUMMARY:
==1234==    definitely lost: 12 bytes in 1 blocks

Bu rapor, 12 byte (3 × int) belleğin serbest bırakılmadığını gösterir. Satır numarasından hatalı satır kolayca bulunabilir.


7. Diğer Valgrind Parametreleri

ParametreAçıklama
--track-origins=yesHatalı değerlerin nerede oluşturulduğunu gösterir.
--show-leak-kinds=allTüm sızıntı türlerini (definitely, indirectly) listeler.
--num-callers=20Daha derin çağrı yığınını gösterir.
--log-file=valgrind.logSonuçları bir dosyaya kaydeder.

8. Windows’ta Alternatif Araçlar


9. En İyi Uygulama Önerileri


10. TL;DR

  • Bellek sızıntısı: new ile ayrılan belleğin delete ile serbest bırakılmaması.
  • Valgrind: Bellek sızıntılarını tespit etmek için güçlü bir analiz aracıdır.
  • Programı valgrind --leak-check=full ./program komutuyla test edebilirsin.
  • Modern C++’ta std::unique_ptr veya std::shared_ptr kullanmak önerilir.
  • Windows ortamında Visual Studio Diagnostic Tools veya Dr. Memory kullanılabilir.
  • Tüm örnekler Visual Studio 2022 veya GCC 11+ derleyicilerinde çalıştırılabilir.

İlişkili Makaleler