Valgrind输出理解

时间:2011-10-07 13:06:13

标签: c memory-leaks malloc valgrind

==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? &安培;它存储哪个地址?

1 个答案:

答案 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;
}