2011-08-24 84 views
1

我们正试图在Linux上运行的C++应用程序找出内存泄漏后相同的内存泄漏。我们使用的是Valgrind 3.6.0,并且能够获得几个“绝对丢失”的堆栈。在报告中,它也给出了“绝对丢失”字节的总数。Valgrind的显示甚至固定泄漏

,我们必须包括的修复是这样的:改变delete ptrdelete[] ptr其中ptr指向的上堆位置的阵列。

请注意,PTR拿着的内存量好。我们也修改了许多其他删除。因此,我们期望泄漏减少。

但修复后,奇怪的Valgrind的仍然报相同数量的泄漏和以前一样,在总结。

==00:00:15:13.661 14014== LEAK SUMMARY: 
==00:00:15:13.661 14014== definitely lost: 236 bytes in 8 blocks 
==00:00:15:13.661 14014== indirectly lost: 22,113 bytes in 17 blocks 
==00:00:15:13.662 14014==  possibly lost: 695,006 bytes in 47 blocks 
==00:00:15:13.662 14014== still reachable: 2,056,059 bytes in 732 blocks 
==00:00:15:13.662 14014==   suppressed: 0 bytes in 0 blocks 

有人可以看到Valgrind的这种行为吗? 我们使用了所有正确选项调用mem_check工具等

+3

没有代码,我们无法帮到你。 –

回答

1

答案是,当时正在用的那种delete错误释放块,就从未纳入摆在首位的泄漏报告,因为valgrind意识到错误使用排序delete和报道,并释放了整个街区。

我们可以看到一个简单的程序这样的效果:当valgrind下运行

int main(int argc, char **argv) 
{ 
    int *x = new int[20]; 

    delete x; 

    return x != 0; 
} 

其中,报告:

==12212== Mismatched free()/delete/delete [] 
==12212== at 0x61DCD1FC: operator delete(void*) (in /usr/lib64/valgrind/vgpreload_memcheck-amd64-linux.so) 
==12212== by 0x4005AC: main (x.c:7 in /tmp/x) 
==12212== Address 0x61fd4040 is 0 bytes inside a block of size 80 alloc'd 
==12212== at 0x61DCD967: operator new[](unsigned long) (in /usr/lib64/valgrind/vgpreload_memcheck-amd64-linux.so) 
==12212== by 0x40059C: main (x.c:5 in /tmp/x) 
==12212== 
==12212== 
==12212== HEAP SUMMARY: 
==12212==  in use at exit: 0 bytes in 0 blocks 
==12212== total heap usage: 1 allocs, 1 frees, 80 bytes allocated 
==12212== 
==12212== All heap blocks were freed -- no leaks are possible 

所以它告诉你正在使用错误的排序delete但随后报告没有泄漏,因为它事实上已经释放了整个街区,一旦它意识到自己的错误。

的泄漏是你有没有试过在所有免费的东西,如果你读它本应先把漏总结,然后在泄漏报告valgrind将会有确切的告诉你,所有泄漏的内存是它报告了这个东西分配,你应该能够跟踪这些泄漏并修复它们。

+0

感谢TomH您的宝贵意见。我知道了。将尝试修复其他泄漏。再次感谢。 –