Утечка памяти: определенно потеряна и, возможно, потеряна - PullRequest
0 голосов
/ 11 октября 2018

Когда я запускаю valgrind, добавляя утечку в мой код, я получаю утечку как все еще достижимую для первого выделения блока, а затем показываю, как определенно потерянную для 9 блоков. Возможно потеря показана из-за другой части кода.Почему это так?

main()
{
........

char *ptr;
For(i=0;i<10;i++)
{
ptr=malloc(sizeof * ptr);
}

.....

}

Отчет:

HEAP SUMMARY:
==13832==     in use at exit: 202,328 bytes in 62 blocks
==13832==   total heap usage: 332 allocs, 270 frees, 283,928 bytes allocated
==13832==
==13832== LEAK SUMMARY:
==13832==    definitely lost: 90 bytes in 9 blocks
==13832==    indirectly lost: 0 bytes in 0 blocks
==13832==      possibly lost: 202,180 bytes in 49 blocks
==13832==    still reachable: 58 bytes in 4 blocks
==13832==         suppressed: 0 bytes in 0 blocks
==13832== Rerun with --leak-check=full to see details of leaked memory

Ответы [ 2 ]

0 голосов
/ 12 октября 2018

В дополнение к ответу Флориана, вот несколько примеров, где у вас будут внутренние указатели

  1. Менеджер памяти.Например, вы знаете, что вы собираетесь выделять очень много маленьких блоков памяти одинакового размера, поэтому вы пишете диспетчер памяти, который выделяет большие блоки и подразделяет их на ваш маленький размер.Эти выделения субблоков являются внутренними указателями.
  2. Отладчик памяти.В этом случае вы выделяете больше памяти, чем запрошено, и дополнительная память используется для заполнения выделенной памяти.Указатель, возвращаемый клиенту, является внутренним указателем.
  3. Структуры данных, такие как строки Паскаля.Здесь вы выделяете память для строки и ее размера.Размер идет перед строкой, поэтому указатель на начало строки является внутренним указателем.
0 голосов
/ 11 октября 2018

В руководстве memcheck говорится следующее:

  • "Возможно, потеряно".[…] Это означает, что была найдена цепочка из одного или нескольких указателей на блок, но по крайней мере один из указателей является внутренним указателем.Это может быть просто случайное значение в памяти, которое указывает на блок, и поэтому вы не должны рассматривать это как должное, если не знаете, что у вас есть внутренние указатели.

Так что это должнообычно это происходит, только если у вас есть вложенные структуры данных в куче, где указатели указывают на выделение, со смещением, а не непосредственно в начале.

...