Valgrind丢失零字节

时间:2011-03-31 10:26:21

标签: memory-leaks valgrind

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

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

我怀疑它只是来自malloc的创造性使用的神器,但确实很好( - ;

编辑:当然真正的问题是它是否可以被忽略,或者是一个有效的泄漏,应该通过释放这些缓冲来解决。

2 个答案:

答案 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大小的块,然后没有释放它。