Valgrind内存泄漏日志

时间:2014-06-13 09:05:52

标签: c++ memory-leaks valgrind

在valgrind,我们有像这样的泄漏日志

==15788== 480 bytes in 20 blocks are definitely lost in loss record 5,016 of 5,501    

==20901== 112 (48 direct, 64 indirect) bytes in 2 blocks are definitely lost in loss record 3,501 of 5,122 

==20901== 1,375,296 bytes in 78 blocks are possibly lost in loss record 5,109 of 5,122

==20901== Conditional jump or move depends on uninitialised value(s)    

==20901== Use of uninitialised value of size 8

在Valgrind的文档中,我找不到确切的细节。可以请有人解释

我知道绝对失去了意味着 - 分配的内存根本没有被释放。但是,“20块”是什么意思,它意味着“在5,501的损失记录中丢失5,016”。如果它说480个字节丢失了,它是指循环中的一次运行还是总计......?

在第二行中,“2个块中的112个(48个直接,64个间接)字节肯定会丢失”,这意味着“48个直接,64个间接”。

我理解“可能丢失”的含义,但这是否意味着valgrind不确定它是否是泄漏......?

关于第4行,我根本不知道。我检查了第4行提供的调用堆栈。我没有注意到任何“跳跃或移动”。

对于第5行,它表示未初始化是在此代码段的最后一行。我在这里看不到任何未初始化的价值。

char *data = new char[somebigSize];
memset(data, '\0', somebigSize);
int sizeInt = sizeof(int);
int length = 20; //some value obtained
int position = 10; 
char *newPtrVar = new char[sizeInt + 1];
memset(newPtrVar, '\0', sizeInt + 1);
memcpy(newPtrVar, &length, sizeInt);
memcpy(&data[position], newPtrVar, sizeInt);

1 个答案:

答案 0 :(得分:0)

valgrind manual详细介绍了这一点。它非常复杂 - 请参阅链接以获取完整的详细信息,但实际上您可以拥有:

  • "仍然可以到达" (指针指向的内存)。
  • "直接丢失" (未指向任何实时指针的内存)
  • "间接失去" (内存中指针指向的内存是"直接丢失)
  • "可能丢失" (指向的内存,但指针不指向内存的开头)。

最后一种情况可能是一些随机指针,它可能像内存管理器一样,在内存返回给用户之前分配一个redzone。