当Valgrind报告o字节丢失时,这意味着什么,比如这里:
==27752== 0 bytes in 1 blocks are definitely lost in loss record 2 of 1,532
我怀疑这只是对
malloc
的创造性使用产生的结果,但确保一下是好的(-;编辑:当然,真正的问题是是否可以忽略它或者它是一个有效的泄漏,需要通过释放这些缓冲区来修复。
当Valgrind报告o字节丢失时,这意味着什么,比如这里:
==27752== 0 bytes in 1 blocks are definitely lost in loss record 2 of 1,532
malloc
的创造性使用产生的结果,但确保一下是好的(-;是的,这是一个真正的泄漏,应该修复。
当你调用malloc(0)
时,malloc可能会给你NULL或者一个保证与任何其他对象的地址不同的地址。
由于你很可能在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
看起来你分配了一个大小为0的块,然后没有及时释放它。