当Valgrind报告字节丢失时,这意味着什么:
==27752== 0 bytes in 1 blocks are definitely lost in loss record 2 of 1,532
我怀疑它只是来自malloc
的创造性使用的神器,但确实很好( - ;
编辑:当然真正的问题是它是否可以被忽略,或者是一个有效的泄漏,应该通过释放这些缓冲来解决。
答案 0 :(得分:13)
是的,这是一个真正的泄漏,应该修复。
当您malloc(0)
时,malloc可以give you NULL, or an address that is guaranteed to be different from that of any other object。
由于你很可能在Linux上,所以你得到了第二个。分配的缓冲区本身没有浪费空间,但是libc必须执行一些内务管理,这确实会浪费空间,因此您无法无限期地继续malloc(0)
。
您可以通过以下方式观察:
#include <stdio.h>
#include <stdlib.h>
int main() {
unsigned long i;
for (i = 0; i < (size_t)-1; ++i) {
void *p = malloc(0);
if (p == NULL) {
fprintf(stderr, "Ran out of memory on %ld iteration\n", i);
break;
}
}
return 0;
}
gcc t.c && bash -c 'ulimit -v 10240 && ./a.out'
Ran out of memory on 202751 iteration
答案 1 :(得分:1)
看起来您分配了一个0大小的块,然后没有释放它。