==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
在我的项目中看到我像这样使用malloc:
malloc(sizeof(some_structure) * some_expression);
在某一点,some_expression给出值0,所以间接地我正在做
malloc(0)
因此,当我不打算使用malloc时,我不会释放它,但在这种情况下,valgrind会显示内存泄漏。为什么呢?
修改:
如果我这样使用:
char *a = malloc(0);
然后a不是NULL。所以问题是为什么不是NULL? &安培;它存储哪个地址?
答案 0 :(得分:6)
从我的malloc(3)
联机帮助页(Linux):
如果size为0,则
malloc()
会返回NULL
或唯一的指针值,以后可以成功传递给free()
。
所以不能保证malloc
在传递0时没有分配任何空间,如果它不是free
,你必须NULL
它给你的指针。
如果malloc
没有返回NULL
,则会得到一个不能用于任何内容的缓冲区,但由于它有唯一的地址,malloc
必须至少分配一个字节。
也许您想将malloc
来电替换为
// like malloc, but guarantees NULL return value if n==0
void *malloc0(size_t n)
{
return n ? malloc(n) : NULL;
}