2011-08-24 51 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您的寶貴意見。我知道了。將嘗試修復其他泄漏。再次感謝。 –