Artykuł opisuje w jaki sposób wykrywa się wycieki pamięci we własnych aplikacjach za pomocą Visual C++. (artykuł)
Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?
Zarejestruj się!
dział serwisuArtykuły
kategoriaInne artykuły
artykułWykrywanie wycieków pamięci za pomocą Visual C++
Autor: Piotr Szawdyński

Wykrywanie wycieków pamięci za pomocą Visual C++

[artykuł] Artykuł opisuje w jaki sposób wykrywa się wycieki pamięci we własnych aplikacjach za pomocą Visual C++.
Jeśli chcemy wykryć wycieki pamięci w naszej aplikacji musimy dodać następujące wpisy:
C/C++
#define _CRTDBG_MAP_ALLOC
#include <cstdlib>
#include <crtdbg.h>
Na samym końcu programu (tj. przed return 0;) należy jeszcze dopisać:
C/C++
_CrtDumpMemoryLeaks();
Powyższa linijka jest odpowiedzialna za zrzut do okna "Output" wycieków pamięci. Jeśli jej nie wywołamy to nie zobaczymy żadnych wycieków pamięci.

Kojelnym mykiem jaki warto zastosować to dodanie następującego wiersza w naszym programie:
C/C++
#define new new(_NORMAL_BLOCK, __FILE__, __LINE__)
Dzięki niemu wskazywane jest miejsce wystąpienia wycieku tj. miejsce w którym została zarezerwowana pamięć i ta pamięć nie została zwolniona. Ważne jest aby ta linijka znalazła się za wszystkimi dołączonymi plikami nagłówkowymi.

Pamiętajmy o tym, że define ma zasięg lokalny, tj. ogranicza się tylko i wyłącznie do jednego pliku tak więc każdy plik w którym chcemy mieć podane wystąpienie błędu musi zawierać wyżej wspomniany wiersz.

Jeśli chcemy wykonać jakieś dodatkowe operacje związane z alokacją czy też dealokacją pamięci możemy to zrobić alternatywną metodą. Wygląda ona następująco:
C/C++
void * operator new( size_t s, const char * filename, unsigned int lineno )
{
    return _malloc_dbg( s, _NORMAL_BLOCK, filename, lineno );
}

void operator delete( void * ptr, const char * filename, unsigned int lineno )
{
    _free_dbg( ptr, _NORMAL_BLOCK );
}

#define new new(__FILE__,__LINE__)

Powyższa metoda została sprawdzona pobieżnie i działa, jednak prawdopodobnie trzeba jeszcze napisać sobie obsługę operatora delete[] - pierwsze rozwiązanie jednak powinno być zadowalające tak więc alternatywne rozwiązanie zamieściłem czysto informacyjnie.