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: definite, indirect, possible, reachable, full 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/