==20420==
==20420== HEAP SUMMARY:
==20420== in use at exit: 0 bytes in 1 blocks
==20420== total heap usage: 1 allocs, 0 frees, 0 bytes allocated
==20420==
==20420== Searching for pointers to 1 not-freed blocks
==20420== Checked 48,492 bytes
==20420==
==20420== 0 bytes in 1 blocks are still reachable in loss record 1 of 1
==20420== at 0x400677E: malloc (vg_replace_malloc.c:195)
==20420== by 0x80483D8: main (jig.c:10)
==20420==
==20420== LEAK SUMMARY:
==20420== definitely lost: 0 bytes in 0 blocks
==20420== indirectly lost: 0 bytes in 0 blocks
==20420== possibly lost: 0 bytes in 0 blocks
==20420== still reachable: 0 bytes in 1 blocks
==20420== suppressed: 0 bytes in 0 blocks
See in my project I use malloc like this:
malloc(sizeof(some_structure) * some_expression);
at one point some_expression gives value 0 so indirectly i am doing
malloc(0)
So when I am not going to malloc a single byte so I am not making free it but in that case valgrind shows memory leackage. Why?
Edit :
If I use like this:
char *a = malloc(0);
Then a is not NULL. So questi开发者_运维问答on is why not NULL? & Which address it stores?
From my malloc(3)
manpage (Linux):
If size is 0, then
malloc()
returns eitherNULL
, or a unique pointer value that can later be successfully passed tofree()
.
So there's no guarantee that malloc
is not allocating any space when you pass it 0, and you have to free
the pointer that it gives you if it isn't NULL
.
If malloc
does not return NULL
, you get a buffer that you can't use for anything, but since it has a unique address, malloc
must have allocated at least one byte.
Maybe you'd want to replace the malloc
call with one to
// like malloc, but guarantees NULL return value if n==0
void *malloc0(size_t n)
{
return n ? malloc(n) : NULL;
}
精彩评论