0

gdbを介してプログラムを実行しています。「free(buffer);」という行を実行します。次に、次のメッセージが表示されます。プログラムはシグナル SIGSEGV を受信しました。セグメンテーション違反です。

 0xb7e97103 in __GI___libc_free (mem=0xbffff11e) at malloc.c:2987
 2987     ar_ptr = arena_for_chunk(p);

プログラムの次の行は「fclose(inptr);」です。この問題を解決するにはどうすればよいですか?

4

2 に答える 2

1

あなたの質問に対する実際の答えはar_ptr = arena_for_chunk(p);、メモリをどこに解放するかを決定する内部データ構造であるということです。ただし、必要に応じて、そこを掘り続けることができます。pこれは、渡すのがほぼ確実である理由buffer、またはそれに密接に関連する値が「正しくない」理由が見つかるまでです。ただし、街灯の下で落とした鍵を探すのと少し似ています。落とした場所で見つけようとするのではなく、そこの方がよく見えるからです。

標準ライブラリのコード、特に些細なプログラムを実行するたびに呼び出されるコードがクラッシュした場合、それは「不正な入力」が原因で発生する時間の99.9%です-関数内ではなく、関数を呼び出すコードを見てください(ただし問題の原因となった入力パラメーターを特定するために、問題が発生したことを振り返る価値があります。

実際の問題は、コードがfree()不正なパラメーターで呼び出していることです。これにより、arena_for_chunkが何か間違ったことをしていることになりますmem = 0xbffff11e。上の行の値を考えると、それbufferは実際にはスタック上の値であり、解放されるべきではないと思います。

于 2013-03-10T20:45:10.880 に答える
1

変数bufferが null であるか、解放できない (または既に解放されている) メモリを指しています。

于 2013-03-10T20:21:06.437 に答える