Быстрый поиск в Интернете приводит к следующему сайту:
http://valgrind.org/docs/manual/faq.html#faq.deflost
Подробности приведены в разделе Memcheck руководства пользователя.
Inshort:
«определенно потерян» означает, что ваша программа утечка памяти - исправить эти утечки!
«косвенно потерян» означает, что ваша программаутечка памяти в основанной на указателе структуре.(Например, если корневой узел двоичного дерева «определенно потерян», все дочерние элементы будут «косвенно потеряны».) Если вы исправите «точно потерянные» утечки, «косвенно потерянные» утечки должны исчезнуть.
«возможно, потерян» означает, что ваша программа утечка памяти, если вы не делаете необычные вещи с указателями, которые могут заставить их указывать на середину выделенного блока;см. руководство пользователя для некоторых возможных причин.Используйте --show-возможно-lost = no, если вы не хотите видеть эти отчеты.
«все еще достижимо» означает, что ваша программа, вероятно, в порядке - она не была бесплатнойнемного памяти это могло бы иметь.Это довольно часто и часто разумно.Не используйте --show-достижимый = да, если вы не хотите видеть эти отчеты.
«подавлено» означает, что ошибка утечки была подавлена.В файлах подавления по умолчанию есть некоторые подавления.Вы можете игнорировать подавленные ошибки.
Обновление:
Разница между «определенно потерянным» и «все еще достижимым» заключается в следующем: Ваша память определенно потеряна , если все ссылки на нее исчезли, и вы не освободили ее раньше - классический случай утечки памяти. все еще достижимо , когда в конце срока жизни вашей программы вы не освободили всю память, которая была динамически выделена , но все еще есть действительные ссылки на нее, так что она может быть освобождено .
Поскольку вся память программы освобождается при завершении программы, это обычно не является проблемой.Однако для долго работающей программы и большого объема памяти, возможно, стоит освободить их вручную, если они вам больше не нужны.
Позвольте мне показать вам простой пример:
#include <stdio.h>
#include <stdlib.h>
char *still_reachable;
char *definitely_lost_global;
int main()
{
char *definitely_lost_local;
// allocate 10 bytes of memory -> will get lost
definitely_lost_local = malloc(10 * sizeof *definitely_lost_local);
// allocate 20 bytes of memory -> will get lost
definitely_lost_global = malloc(20 * sizeof *definitely_lost_global);
definitely_lost_global = NULL;
// Now there aren't any references to those 20 bytes anymore, so memory is lost.
// allocate 40 bytes of memory. The global pointer has static storage duration.
// We do not change the pointer, so the respective memory will
// be still reachable by the end of program lifetime
still_reachable = malloc(40 * sizeof *still_reachable);
} // scope of definitely_lost_local ends here --> 10 bytes are lost!
Мы можем догадаться, что в этом примере будет потеряно 10 + 20 = 30 байт, тогда как 40 байт все еще будут доступны.Итак, давайте проверим с valgrind:
==19474== Memcheck, a memory error detector
==19474== Copyright (C) 2002-2017, and GNU GPL'd, by Julian Seward et al.
==19474== Using Valgrind-3.13.0 and LibVEX; rerun with -h for copyright info
==19474== Command: ./prog
==19474==
==19474==
==19474== HEAP SUMMARY:
==19474== in use at exit: 70 bytes in 3 blocks
==19474== total heap usage: 3 allocs, 0 frees, 70 bytes allocated
==19474==
==19474== LEAK SUMMARY:
==19474== definitely lost: 30 bytes in 2 blocks
==19474== indirectly lost: 0 bytes in 0 blocks
==19474== possibly lost: 0 bytes in 0 blocks
==19474== still reachable: 40 bytes in 1 blocks
==19474== suppressed: 0 bytes in 0 blocks
==19474== Rerun with --leak-check=full to see details of leaked memory
==19474==
==19474== For counts of detected and suppressed errors, rerun with: -v
==19474== ERROR SUMMARY: 0 errors from 0 contexts (suppressed: 0 from 0)
Вуаля, как и ожидалось.