Przydatne narzędzie do analizy pamięci aplikacji c++. Valgrind ma wiele różnych parametrów ale w tym poście zajmę się omówieniem wycieków pamięci.

Aby zweryfikować wycieki pamięci możemy uruchomić naszą aplikację za pomocą komendy:

valgrind --leak-check=full --show-leak-kinds=all EXE_APP

gdzie:

–leak-check – poziom wycieku jaki chcemy badać, full oznacza, że chcemy analizować każdy poziom wycieku

–show-leak-kinds – pokazuje poziom wycieku: definiteindirectpossiblereachablefull oznacza wszystkie poziomy wycieków

Najprostszy sposób kodu z wyciekami pamięci:

void leak (int count = 100) {
    for (int i = 0; i < count; i++) {
        int * memory_leak = new int[i];
        for (int j =0; j< i; j++) {
            memory_leak[j] = j;
        }
    }
}

w wyniku działania aplikacji mamy niewielki raport z wycieków pamięci, który wygląda następująco:

W przypadku aplikacji która ma wycieki pamięci:

Obiekty tworzone na stercie możemy usuwać w klasyczny sposób, przez metodę free(..) lub delete w zależności od sposobu rejestracji.

Drugim sposobem jest shared_ptr i unique_ptr –  obiekty usuwane są z pamięci gdy nie wskazuje na niech żaden ze wskaźników. Dostępne od C++ 11.

Przykład kodu z wykorzystaniem  shared_ptr :

void leak (int count = 100) {
    for (int i = 0; i < count; i++) {
        shared_ptr<int[]> memory_leak (new int[i]);
        for (int j =0; j< i; j++) {
            memory_leak[j] = j;
        }
    }
}

Poniżej wyniki uruchomienia analizy:

Źródło: http://valgrind.org/

Dodaj komentarz

Twój adres e-mail nie zostanie opublikowany. Wymagane pola są oznaczone *