Memory leaks Valgrind中丢失的零字节

Memory leaks Valgrind中丢失的零字节,memory-leaks,valgrind,Memory Leaks,Valgrind,Valgrind报告o字节丢失时意味着什么,如下所示: ==27752== 0 bytes in 1 blocks are definitely lost in loss record 2 of 1,532 我怀疑这只是创造性地使用malloc的产物,但可以肯定(- 编辑:当然,真正的问题是它是否可以忽略,或者它是否是一个有效的泄漏,应该通过释放这些缓冲区来修复。看起来您分配了一个大小为0的块,但随后没有释放它。是的,这是一个真正的泄漏,应该修复 当您malloc(0)时,malloc可以是

Valgrind报告o字节丢失时意味着什么,如下所示:

==27752== 0 bytes in 1 blocks are definitely lost in loss record 2 of 1,532
我怀疑这只是创造性地使用
malloc
的产物,但可以肯定(-


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

看起来您分配了一个大小为0的块,但随后没有释放它。

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

当您
malloc(0)
时,malloc可以是

因为你很可能是在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
#包括
#包括
int main(){
无符号长i;
对于(i=0;i<(尺寸t)-1;++i){
void*p=malloc(0);
if(p==NULL){
fprintf(stderr,“在%ld次迭代中内存不足\n”,i);
打破
}
}
返回0;
}
gcc t.c&&bash-c'ulimit-v 10240&&a.out'
202751次迭代时内存不足