2011-01-22 8 views
2

私はメモリリークを探すためにvalgrindを実行しています。私は、main関数に2つのグローバル変数alloc'dを持っています。そして、mainの終わりに私は両方の解放が、Valgrindのは書き込み続けて:私はこれらの2つの変数を解放することができないのはなぜValgrindとグローバル変数

==18311== LEAK SUMMARY: 
==18311== definitely lost: 32 bytes in 2 blocks 
==18311== indirectly lost: 0 bytes in 0 blocks 
==18311==  possibly lost: 0 bytes in 0 blocks 
==18311== still reachable: 0 bytes in 0 blocks 
==18311==   suppressed: 0 bytes in 0 blocks 

==18311== 16 bytes in 1 blocks are definitely lost in loss record 1 of 2 
==18311== at 0x4025BD3: malloc (vg_replace_malloc.c:236) 
==18311== by 0x804A30C: main (application.c:730) 
==18311== 
==18311== 16 bytes in 1 blocks are definitely lost in loss record 2 of 2 
==18311== at 0x4025BD3: malloc (vg_replace_malloc.c:236) 
==18311== by 0x804A31D: main (application.c:731) 

リークの概要を?

編集

someList *something; *something_else; 

使用構造体はタイプchar *の二つのフィールドとフィールドsomeList *nextを持っています。 後で多くのコードがあります。いくつかのスレッドは、この2つの変数を使用してオブジェクトの追加/編集/削除を行います。

->something->next = object 1、および object ksomeList *のすべてのインスタンスであることを意味
something -> object 1 -> ... -> object n 
something_else -> object 1 -> ... -> object m 

アプリケーションの最後に、私は各object k要素のすべてのフィールドを解放しました。その後、最後の部分:

free(something); 
free(something_else); 

オブジェクトのフィールドを解放するのを忘れた可能性があります。これは私がここにいる行動を引き起こすことができますか?

今はっきりしていることを願っています。

+0

無料のコードの部分は実行されていますか?メイン関数からの早期復帰はスキップすることがあります。 – CodesInChaos

+1

コードを見る必要があります。 – SoapBox

+0

@CodeInChaos yes:コードが実行されます。とにかくありがとう。 – Donovan

答えて

0

それぞれmalloc()コールでは、メモリリークを避けるため、通常は対応するfree()コールが必要です。最適なメモリ使用量を得るには、割り当てられたメモリブロックをできるだけ早くfree()に割り当てる必要があります。あなたのケースでは

、あなたがapplication.c:730application.c:731で2本のmalloc()電話を持って、そのためにあなたのプログラムが終了するまでに作られた全くfree()コールはありません。したがって、そこに割り当てられたメモリブロックは解放されません。これにより、メモリリークが発生し、Valgrindが検出されて報告されます。

あなたのプログラムに関するいくつかのコードおよび/または情報を私たちに提供していない限り、私たちがあなたにもっと役立つ方法はありません。

EDIT:

==18311== definitely lost: 32 bytes in 2 blocks 
... 
==18311== still reachable: 0 bytes in 0 blocks 

あなたは間違いなくあなたのプログラムが終了する時にそれらに2つのメモリブロックと、そこには、ポインタを「失われた」している:

あなたValgrind出力に2つの興味深い行があります。つまり、これらの2つのブロックへのポインタは実際に上書きされたり、プログラムの途中で値が失われたりします。

この問題の一般的な原因は、free()中間の呼び出しなしで、同じポインタへの2つのmalloc()コールの結果の格納です。ポインタの算術演算によってポインタ値が変更される可能性があります。Valgrindは、これらのケースの一部を検出するために努力していますが、コードに応じて必ずしも成功するとは限りません。

+0

この回答の最初の文はvalgrindのメモリリークの考え方であり、ユーザーのものではないことに注意してください。どのユーザーの目にあっても、終了直前まで何も解放しない長命のプログラムでは、メモリリークが大きく、valgrindの目には漏れはありません。逆に、タスクを実行し、何も解放しない一回限りのコマンドラインプログラムは、ユーザーの目にはメモリリークはありませんが、valgrindではありません。 –

+0

@R ..:私はこの点をいくらかカバーするために少し答えを言い換えました。 – thkala

+0

これを読んだ後に私が収集したものから、グローバル変数はfree'dする必要はありません、それは安全な仮定ですか? 'char mychar [80];' < - メイン(グローバル)の外側にあります。 –

1

すべての変数の割り当てを解除してもよろしいですか? Valgrindはあなたがいないと言います。

コードをスリムにしてここに投稿するか、デバッグをいくつか実行してください。