Ответ заключается в том, что блок, который был освобожден с неправильным видом 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
точно скажет вам, где вся утечка памяти был выделен, и вы должны быть в состоянии отследить эти утечки и исправить их.