Valgrind показывает те же утечки памяти даже после устранения утечек - PullRequest
1 голос
/ 24 августа 2011

Мы пытаемся выяснить утечки памяти в приложении C ++, работающем в Linux. Мы используем Valgrind 3.6.0 и смогли получить несколько «точно потерянных» стеков. В отчете также указано общее количество «точно потерянных» байтов.

Исправление, которое мы должны были включить, было следующим: изменено delete ptr на delete[] ptr, где ptr указывает на массив местоположений в куче.

Обратите внимание, что у ptr было достаточно памяти. И мы исправили много других удалений аналогичным образом. Следовательно, мы ожидали, что утечки уменьшатся.

Но после исправления, как ни странно, Вальгринд в отчете по-прежнему сообщал о том же количестве утечек, что и раньше.

==00:00:15:13.661 14014== LEAK SUMMARY:
==00:00:15:13.661 14014==    definitely lost: 236 bytes in 8 blocks
==00:00:15:13.661 14014==    indirectly lost: 22,113 bytes in 17 blocks
==00:00:15:13.662 14014==      possibly lost: 695,006 bytes in 47 blocks
==00:00:15:13.662 14014==    still reachable: 2,056,059 bytes in 732 blocks
==00:00:15:13.662 14014==         suppressed: 0 bytes in 0 blocks

Может ли кто-нибудь пролить свет на это поведение Вальгринда? Мы используем все нужные опции для вызова инструмента mem_check и т. Д.

1 Ответ

1 голос
/ 24 августа 2011

Ответ заключается в том, что блок, который был освобожден с неправильным видом delete, никогда не был включен в отчет об утечке, поскольку valgrind понял, что использовался неправильный тип delete, и сообщил, что и освободил весь блок.

Мы можем увидеть этот эффект с помощью простой программы:

int main(int argc, char **argv)
{
  int *x = new int[20];

  delete x;

  return x != 0;
}

Который при запуске под valgrind сообщает:

==12212== Mismatched free() / delete / delete []
==12212==    at 0x61DCD1FC: operator delete(void*) (in /usr/lib64/valgrind/vgpreload_memcheck-amd64-linux.so)
==12212==    by 0x4005AC: main (x.c:7 in /tmp/x)
==12212==  Address 0x61fd4040 is 0 bytes inside a block of size 80 alloc'd
==12212==    at 0x61DCD967: operator new[](unsigned long) (in /usr/lib64/valgrind/vgpreload_memcheck-amd64-linux.so)
==12212==    by 0x40059C: main (x.c:5 in /tmp/x)
==12212== 
==12212== 
==12212== HEAP SUMMARY:
==12212==     in use at exit: 0 bytes in 0 blocks
==12212==   total heap usage: 1 allocs, 1 frees, 80 bytes allocated
==12212== 
==12212== All heap blocks were freed -- no leaks are possible

Таким образом, он сообщил вам о неправильном использовании delete, но затем не сообщил об утечках, поскольку фактически освободил весь блок, как только осознал вашу ошибку.

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

...