Это ложное срабатывание. Во всяком случае, проблема в том, что у heapusage недостаточно хорошей документации. Я рекомендую использовать более качественную систему проверки утечек, например, дезинфицирующее средство от утечек или Valgrind.
Я создал файл test.c
.
#include <stdio.h>
int main(int argc, char **argv) {
puts("Hello, world!");
}
С дезинфицирующим средством от утечек, без ошибок.
$ cc -fsanitize=leak -g test.c
$ ./a.out
Hello, world!
С адресным дезинфицирующим средством, без ошибок.
$ cc -fsanitize=address -g test.c
$ ./a.out
Hello, world!
С Valgrind ошибок нет.
$ cc -g test.c
$ valgrind ./a.out
==189174== Memcheck, a memory error detector
==189174== Copyright (C) 2002-2017, and GNU GPL'd, by Julian Seward et al.
==189174== Using Valgrind-3.13.0 and LibVEX; rerun with -h for copyright info
==189174== Command: ./a.out
==189174==
Hello, world!
==189174==
==189174== HEAP SUMMARY:
==189174== in use at exit: 0 bytes in 0 blocks
==189174== total heap usage: 1 allocs, 1 frees, 1,024 bytes allocated
==189174==
==189174== All heap blocks were freed -- no leaks are possible
==189174==
==189174== For counts of detected and suppressed errors, rerun with: -v
==189174== ERROR SUMMARY: 0 errors from 0 contexts (suppressed: 0 from 0)
С кучей, течь!
$ cc -g test.c
$ ./heapusage ./a.out
Hello, world!
==189005== Heapusage - https://github.com/d99kris/heapusage
==189005==
==189005== HEAP SUMMARY:
==189005== in use at exit: 1024 bytes in 1 blocks
==189005== total heap usage: 1 allocs, 0 frees, 1024 bytes allocated
==189005== peak heap usage: 1024 bytes allocated
==189005==
==189005== 1024 bytes in 1 block(s) are lost, originally allocated at:
==189005== at 0x00007f99f0de56a7: malloc + 49
==189005== at 0x00007f99f0a96a32: _IO_file_doallocate + 114
==189005== at 0x00007f99f0aa4a46: _IO_doallocbuf + 70
==189005== at 0x00007f99f0aa3da8: _IO_file_overflow + 472
==189005== at 0x00007f99f0aa2e86: _IO_file_xsputn + 182
==189005== at 0x00007f99f0a99033: _IO_puts + 211
==189005== at 0x000055f667ee7655:
==189005== at 0x00007f99f0a502b1: __libc_start_main + 241
==189005== at 0x000055f667ee755a:
==189005==
==189005== LEAK SUMMARY:
==189005== definitely lost: 1024 bytes in 1 blocks
==189005==
Анализ
Heapusage работает, перехватывая malloc и free (и не сканирует память на предмет указателей). Heapusage не объясняет преимущества или недостатки этого подхода полностью в документации. Одним из преимуществ является то, что это быстро, но недостатком является то, что это не точно.
В частности, я бы назвал heapusage неправильными сообщениями: слова «определенно потерянный» здесь не применимы!
Если вам нужны более качественные сообщения об ошибках, используйте один из рекомендованных выше инструментов: средство для устранения утечек или Valgrind (memcheck).
В общем, я также хотел бы напомнить людям, что ложные срабатывания являются фактом жизни с такими инструментами. Вопрос о том, является ли программа «Valgrind clean», отличается от правильности программы.