Понимать типы утечек памяти в инструменте valgrind memcheck - PullRequest
0 голосов
/ 24 мая 2018

Я использую инструмент Valgrind для понимания различных типов утечек памяти: непосредственно потеряна, косвенно потеря Все еще достижима и, возможно, потеряна.Пример 1:

#include<stdio.h>
#include <stdlib.h>
main() {
    int *p, i;
     p = malloc(10*sizeof(int));
      for(i = 0;i < 10;i++)
       p[i] = i;
       //free(p);
      printf("Freed\n ");

}

LEAK SUMMARY:
==31770==    definitely lost: 0 bytes in 0 blocks
==31770==    indirectly lost: 0 bytes in 0 blocks
==31770==      possibly lost: 20 bytes in 1 blocks
==31770==    still reachable: 0 bytes in 0 blocks
==31770==         suppressed: 0 bytes in 0 blocks


eg2:
main() {
    int *p, i;
     p = malloc(10*sizeof(int));

//     printf("freed");
}

 LEAK SUMMARY:
==14950==    definitely lost: 0 bytes in 0 blocks
==14950==    indirectly lost: 0 bytes in 0 blocks
==14950==      possibly lost: 0 bytes in 0 blocks
==14950==    still reachable: 40 bytes in 1 blocks
==14950==         suppressed: 0 bytes in 0 blocks

If a uncomment the printf statement:
 LEAK SUMMARY:
==15889==    definitely lost: 40 bytes in 1 blocks
==15889==    indirectly lost: 0 bytes in 0 blocks
==15889==      possibly lost: 0 bytes in 0 blocks
==15889==    still reachable: 0 bytes in 0 blocks
==15889==         suppressed: 0 bytes in 0 blocks

Пожалуйста, объясните мне точно об этих различных утечках памяти.

1 Ответ

0 голосов
/ 24 мая 2018

Быстрый поиск в Интернете приводит к следующему сайту:

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)

Вуаля, как и ожидалось.

...