質問

使用時のmallocの場合にもコアダンプのエラー:

malloc(): memory corruption: ....... ***

このmallocたメモリを割り当てなかった無料を投入するのか?その場合の原因とそのか。

役に立ちましたか?

解決

mallocの実装に完全に依存しますが、通常これが意味するのは、mallocの前のある時点で何かがそのサイズよりも多くのデータをmallocされたバッファに書き込んだことです。

多くのmalloc実装では、一部のデータをメモリとインラインで保存します。つまり、

+--------------------------------+
|14 bytes -> Padding             | 
+--------------------------------+
|2 bytes -> Internal malloc info |
+--------------------------------+
|6 bytes -> Your data            |
+--------------------------------+
|8 bytes -> Padding              |
+--------------------------------+
|2 bytes -> Internal malloc info |
+--------------------------------+

そのため、あなたのコードまたはライブラリのいくつかのコードがその6バイトのバッファに16バイトを書き込んだ場合、パディングと2バイトの内部malloc情報が上書きされます。次回mallocを呼び出すと、データを調べてスペースを見つけ、上書きされたスペースにヒットしようとしますが、上書きするとヒープが破損するため無意味になります。

実装によっては、doubleをfreeにすることでこのようなエラーが発生することもあります。

他のヒント

ほとんどの場合、これはmalloc自体の問題ではありません。むしろ、これは、アプリケーションがヒープの一部を変更してはいけない問題です。

Linuxで実行している場合は、 Valgrind を使用して、ヒープを破壊しているコードを確認してください。

これの通常の原因は、malloc()が上書きを許可していないデータを上書きしたことです-バッファオーバーラン(指定されたスペースの終わりを超えて書き込む)またはバッファアンダーラン(開始前に書き込む)バッファの)。

malloc()などによって割り当てられなかったポインターを解放するか、malloc()によって割り当てられたポインターを再度解放(二重解放)することにより、時々発生する可能性があります。たとえば、静的バッファを解放するのは悪い考えです。破損します。

問題はコードにあると想定する必要があります-malloc()などでは問題になる可能性は非常に低く、使用している他のライブラリにはない可能性があります。

べるものはいくつかありますが通常の原因はヒープの破壊:

  • overrunningのメモリ割り当て書くのに割り当てられたブロック)
  • ダブルブロックの解放
  • 使用後のポインタで解放された
  • もちろん何か書き誤を通じてポインタとなるものを前の交付ただし、この場合、ramのヒット"またはローグのポインタ)により一般の場合すべて含んでいるのです。

されるべきであるこれらの問題は難しいデバッグが原因と結果がよく分離する時間と空間の異なる地域のコードとします。いバグを修正しないなったらいいなと思います永遠(コンピュータ時間の経過後、バグの原因となった問題を実行す.

使用デバッグヒープでもデバッグこれらの課題です。Microsoftコンパイラでコンパイルして CrtDebugヒープ が有効になりdebugビルドできて追加の設定項目でも通知非通知を設定できます。お使いいただくことによってはGCCのボックスがあり、ツールに精通してい通りなど Valgrind、電気柵 います。最後にあり、トン 自家栽培のヒープのデバッグ図書館 書を発行することも可能(Googleます。

malloc()ステートメントを提供していただけますか?

また、戻り値がnullでないことを再確認したいですか

最初に割り当てるメモリがないこと以外に、 malloc()または new を使用するときに遭遇した問題は、実際に結果として生じた場所と同様の性質です破損したヒープ。私は通常、いくつかの「面白い」を見つけました。プログラム内のどこかでmemcpy()のようなコードを実行し、文字バッファーを使用して、バッファーオーバーランとマングルされたアドレススペースを発生させます。

-bn

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top