In Shell Type:
> valgrind --tool=memcheck --leak-check=yes --show-reachable=yes ./test
The it reports:
==5030==
==5030== ERROR SUMMARY: 0 errors from 0 contexts (suppressed: 12 from 1)
==5030== malloc/free: in use at exit: 16441 bytes in 3 blocks.
==5030== malloc/free: 33 allocs, 30 frees, 16648 bytes allocated.
==5030== For counts of detected errors, rerun with: -v
==5030== searching for pointers to 3 not-freed blocks.
==5030== checked 1401780 bytes.
==5030==
==5030== 15 bytes in 1 blocks are definitely lost in loss record 1 of 2
==5030== at 0x1B904984: malloc (vg_replace_malloc.c:131)
==5030== by 0x8049802: occ_cfg_gen_hier_str (occ_cfg_parse.y:256)
==5030== by 0x804910E: yyparse (occ_cfg_parse.y:165)
==5030== by 0x804997E: main (occ_cfg_parse.y:294)
==5030==
==5030==
==5030== 16426 bytes in 2 blocks are still reachable in loss record 2 of 2
==5030== at 0x1B904984: malloc (vg_replace_malloc.c:131)
==5030== by 0x804ABDD: yy_flex_alloc (lex.yy.c:2277)
==5030== by 0x804A867: yy_create_buffer (lex.yy.c:1957)
==5030== by 0x8049AE9: yylex (lex.yy.c:1182)
==5030==
==5030== LEAK SUMMARY:
==5030== definitely lost: 15 bytes in 1 blocks.
==5030== possibly lost: 0 bytes in 0 blocks.
==5030== still reachable: 16426 bytes in 2 blocks.
==5030== suppressed: 0 bytes in 0 blocks.
what's the difference between "definitely lost", "indirectly lost", "possibly lost", "still reachable", and "suppressed"?
The details are in the Memcheck section of the user manual.
In short:
"definitely lost" means your program is leaking memory -- fix those leaks!
"indirectly lost" means your program is leaking memory in a pointer-based structure. (E.g. if the root node of a binary tree is "definitely lost", all the children will be "indirectly lost".) If you fix the "definitely lost" leaks, the "indirectly lost" leaks should go away.
"possibly lost" means your program is leaking memory, unless you're doing funny things with pointers.
"still reachable" means your program is probably ok -- it didn't free some memory it could have. This is quite common and often reasonable. Don't use --show-reachable=yes if you don't want to see these reports.
"suppressed" means that a leak error has been suppressed. There are some suppressions in the default suppression files. You can ignore suppressed errors.