2011-08-24 4 views
1

Linuxで動作するC++アプリケーションでメモリリークを把握しようとしています。私たちはValgrind 3.6.0を使用しており、「確実に失われた」スタックをほとんど取得できませんでした。レポートでは、「完全に失われた」バイト数も表示されていました。Valgrindはリークを修正した後でも同じメモリリークを示します

修正内容は次のとおりです。変更されたdelete ptrdelete[] ptrここで、ptrはヒープ上の場所の配列を指しています。

ptrが十分な量のメモリを保持していたことに注意してください。同様に他の多くの削除を修正しました。したがって、我々はリークが減少することを期待していました。

しかし、修正後、バググルンドはまだ、サマリーの以前と同じ数のリークを報告しています。

==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 

誰かがヴァルグリンドのこのような動きを見せてくれますか? 我々はMEM_CHECKツールを呼び出すために、すべての権利のオプションを使用しているなど

+3

コードなしでは、お手伝いできません。 –

答えて

1

答えがvalgrindが間違っていることに気づいたのでdeleteの間違った一種で解放されたブロックが最初の場所でのリークレポートに含まれなかったということですdeleteのソートが使用され、それが報告され、ブロック全体が解放されました。

私たちは、簡単なプログラムで、この効果を見ることができます:

==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の下で実行した場合、報告し、

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

    delete x; 

    return x != 0; 
} 

あなたの間違いを認識したらブロック全体を解放したため、漏れは報告されませんでした。

漏れはあなたがすべてで解放しようとしていないものであり、あなたは、そのリークの概要を先行しているはずリークレポートを読めば、すべてのメモリリークがあった場所valgrind正確にあなたに言っているだろうと報告している事をそれらのリークを追跡して修正できるはずです。

+0

貴重な情報をお寄せいただきありがとうございます。わかった。他のリークを修正しようとします。再度、感謝します。 –

関連する問題