Valgrind中没有丢失零字节

8

当Valgrind报告o字节丢失时,这意味着什么,比如这里:

==27752== 0 bytes in 1 blocks are definitely lost in loss record 2 of 1,532

我怀疑这只是对malloc的创造性使用产生的结果,但确保一下是好的(-;
编辑:当然,真正的问题是是否可以忽略它或者它是一个有效的泄漏,需要通过释放这些缓冲区来修复。
2个回答

13

是的,这是一个真正的泄漏,应该修复。

当你调用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

1

看起来你分配了一个大小为0的块,然后没有及时释放它。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接