2011-10-07 41 views
1
==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这样的:Valgrind的输出了解

malloc(sizeof(some_structure) * some_expression); 

在一个点some_expression给出值0,这样间接地我做

malloc(0) 

所以,当我不去malloc单个字节,所以我不释放它,但在这种情况下valgrind显示内存泄漏。为什么?

编辑:

如果我用这样的:

char *a = malloc(0); 

然后一个不为空。所以问题是为什么不是NULL? &它存储哪个地址?

+0

的[零字节在Valgrind的丢失]可能重复(http://stackoverflow.com/questions/5498395/zero-bytes-中损失的Valgrind的) –

回答

6

从我malloc(3)手册页(Linux的):

如果大小为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; 
}