Valgrind is definitely lost and reached with a major return exit

Valgrind reports that it has lost memory if I exit main with return 0;

, but reports the still available memory if I exit main with exit(0);

.

test-reachable.c:

#include <stdlib.h>

int main() {
  void *data = malloc(256);
  exit(0);
}

      

test-lost.c:

#include <stdlib.h>

int main() {
  void *data = malloc(256);
  return 0;
}

      

Behavior:

$ gcc test-reachable.c -o test-reachable
$ valgrind --leak-check=yes ./test-reachable
==7696== Memcheck, a memory error detector
==7696== Copyright (C) 2002-2013, and GNU GPL'd, by Julian Seward et al.
==7696== Using Valgrind-3.10.1 and LibVEX; rerun with -h for copyright info
==7696== Command: ./test-reachable
==7696== 
==7696== 
==7696== HEAP SUMMARY:
==7696==     in use at exit: 256 bytes in 1 blocks
==7696==   total heap usage: 1 allocs, 0 frees, 256 bytes allocated
==7696== 
==7696== LEAK SUMMARY:
==7696==    definitely lost: 0 bytes in 0 blocks
==7696==    indirectly lost: 0 bytes in 0 blocks
==7696==      possibly lost: 0 bytes in 0 blocks
==7696==    still reachable: 256 bytes in 1 blocks
==7696==         suppressed: 0 bytes in 0 blocks
==7696== Reachable blocks (those to which a pointer was found) are not shown.
==7696== To see them, rerun with: --leak-check=full --show-leak-kinds=all
==7696== 
==7696== For counts of detected and suppressed errors, rerun with: -v
==7696== ERROR SUMMARY: 0 errors from 0 contexts (suppressed: 0 from 0)
$ gcc test-lost.c -o test-lost
$ valgrind --leak-check=yes ./test-lost
==7774== Memcheck, a memory error detector
==7774== Copyright (C) 2002-2013, and GNU GPL'd, by Julian Seward et al.
==7774== Using Valgrind-3.10.1 and LibVEX; rerun with -h for copyright info
==7774== Command: ./test-lost
==7774== 
==7774== 
==7774== HEAP SUMMARY:
==7774==     in use at exit: 256 bytes in 1 blocks
==7774==   total heap usage: 1 allocs, 0 frees, 256 bytes allocated
==7774== 
==7774== 256 bytes in 1 blocks are definitely lost in loss record 1 of 1
==7774==    at 0x4C2C080: calloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
==7774==    by 0x40051C: main (in /tmp/test-lost)
==7774== 
==7774== LEAK SUMMARY:
==7774==    definitely lost: 256 bytes in 1 blocks
==7774==    indirectly lost: 0 bytes in 0 blocks
==7774==      possibly lost: 0 bytes in 0 blocks
==7774==    still reachable: 0 bytes in 0 blocks
==7774==         suppressed: 0 bytes in 0 blocks
==7774== 
==7774== For counts of detected and suppressed errors, rerun with: -v
==7774== ERROR SUMMARY: 1 errors from 1 contexts (suppressed: 0 from 0)

      

Should they behave the same?

+3


source to share


2 answers


Should they behave the same?

Not.



In test-reachable.c, memory is referenced by the stack variable data

during program exit, so it is still available, and in test-lost.c, memory is no longer referenced because the function main

has already returned, the reference no longer exists, the memory is definitely lost.

+3


source


In C ++, when called return

in main()

, the destructors are invoked for objects with local coverage, whereas the call exit()

will not be called a destructor for locally objects with the area. I think this is similar to C in regards to objects allocated on the stack.



This probably explains why in the case, return

unallocated memory is treated as definitely lost, and in the case, exit(0)

memory is reported as unavailable.

+2


source







All Articles