14 Kasım 2018 Çarşamba

C++ - Memory Leak (Bellek sızıntısı) tespiti

 "Memory leak" yani bellek sızıntısı bir uygulamanın kullandığı hafıza bloğunu serbest bırakmaması sonucunda, kendisi için ayrılan bellek miktarının aşırı şişmesi durumudur. Özellikle uzun süreli çalışan uygulamalarda sistem kaynaklarının aşırı tüketilmesine, dolayısıyla performans kaybına ve aynı zamanda uygulamanın çökmesine sebep olabilmektedir. 

Konuya C++ özelinde baktığımızda dinamik olarak hafızada ayrılan bellek (bknz:pointer) geri bırakılmadığı durumlarda böyle bir sorunla karşılaşılır. Nispeten büyük bir projede ise nerede bellek sızıntısı olduğunu bulmak son derece zor olabilir. Yazdığımız programda nerede bellek sızıntısı olduğunu bulmak için geliştirilmiş çeşitli araçlar mevcut, ben de bu yazı kapsamında sizlere kullanmış olduğum Visual Leak Detector hakkında bilgi vereceğim. Kurulumu son derece basit, linkten installer'ı indirip bilgisayarınıza kolayca kurabiliyorsunuz.


Kullanımına gelecek olursak;

#include "vld.h" 

ile visual leak detector ün yazdığımız kodu analiz etmesini sağlıyoruz. Burada istisna olan nokta şu, eğer  "stdafx.h" dosyası include edilmiş ise, bunun dosyanın en başında olması gerekiyor. Yani vld.h dosyası, stdafx.h dan sonra include edilmeli. Bunun dışında projede istenilen dosyada ve sırada vld.h dosyasının include edilmesi yeterli. 

Şimdi memory leak içeren bir kod yazalım ve uygulamayı debug modunda çalıştırarak memory leak'leri tespit edelim.


Örnekte bir döngü içerisinde pointer ile integer değişken için yer ayırdık, Fakat ayrılan yeri silmedik. Ekranda 5 memory leaks oluştu diye bir uyarı aldık, output ekranını yukarı kaydırırsanız, her bir bellek sızıntısı ile ilgili detayları da görüntüleyebiliyorsunuz.

Hatamızı gördükten sonra hatamızı çözüp, kodu tekrar çalıştırdığımızda, "no memory leaks detected" mesajını okuyarak sızıntısız kod yazmış olmanın keyfini yaşıyoruz :)


Hiç yorum yok:

Yorum Gönder