質問
私はこれが本当に一般的であることを知っていますが、Visual C ++ 2008 Expressで.Cファイルを実行するときに「This」(以下を参照)を取得します。それは私が電話するときに起こります malloc ()
. 。これについて私の作業を取ります - 私はメモリを適切に動的に割り当てます。
Heap [code.exe]:Heap:Freed WindowsがCode.exeのブレークポイントをトリガーした後、2111111A10が211111A10で変更されました。
これは、Heapの腐敗によるものである可能性があります。これは、code.exeまたはロードしたDLLのバグを示しています。
これは、code.exeがフォーカスを持っている間、ユーザーがf12を押すことによるものである可能性があります。
出力ウィンドウには、より多くの診断情報がある場合があります。
なぜこのエラーが発生するのですか?これはどういう意味ですか?
解決
エラーメッセージは、それを手に入れた理由を正確に示しています。
無料のヒープブロック211A10が解放された後、2111111A10が修正されました
あなたは、その記憶の領域に書かれた何かが解放されたヒープ割り当てのブロックを持っていました。解放された記憶のブロックに手紙を書くのはいいことではありません。
他のヒント
エラーは実際にはありません ハプニング mallocと呼ぶとき;それは、無料のヒープスキャンをトリガーするときです。実際のエラーは以前どこかで起こりました。アドレス211a10でいくつかのメモリをマロックしました(それがマロックがあなたに戻ったものです)。それからあなた(または他のlib)はそれを解放しました。その後、デバッグモードでMallocを呼び出すと、貧しいプログラマーであるあなたにとって礼儀として、ヒープ全体をスキャンします。それは、誰か(あなたまたはあなたが電話するあなたまたはあなたが電話するいくつかのLib)がその配列の一部、特にアドレス2111118、またはアレイに0xe8バイトで書いたことを発見します。したがって、あなたはまだ解放されているポインターの上にぶら下がっていて、それを使用しているか、ランダムメモリをゴミ箱に捨てているだけです。
私の場合、同様の症状がある場合、問題はstructアラインメントの不一致(/zpオプション)でした
コードに対して、外部ライブラリ(wxwidgets)とは異なるstructアライメントを定義しました。ただし、WXWidgetsはMakeFileで構築されたため、Defaut /ZPを使用してコンパイルされました。 wxwidgetは静的にリンクされています。
あなたはそれをすることができますが、あなたがwxwidgetsクラスオブジェクトを削除しようとする場合 あなたのコードから コンパイラは、構造体メンバーの正確なサイズについて混乱します。実行するとき、あなたはこのメッセージを受け取ります:
HEAP[Code.exe]: HEAP: Free Heap block 211a10 modified at 211af8 after it was freed
Windows has triggered a breakpoint in Code.exe.
解決:
すべてのコードとライブラリで同じ「structメンバーアライメント」を必ず使用してください。
最良のルールは、 /ZPを定義して「デフォルト」値を使用することです。 Visual Studioで、プロパティC/C ++コード生成の下
MSDNは引用してください: "特定のアライメント要件がない限り、このオプションを使用しないでください。" こちらをご覧ください
ヒント:使用します #pragmaパック いくつかの構造体のアライメントを制御する必要がある場合そこを見て
例:
#pragma pack(1) // - 1 byte alignment
typedef union
{
u64 i;
struct{ // CUSTOMS.s is used by Folders
u32 uidx; // Id, as registered
byte isoS, isoT; // isoS/isoT combination.
byte udd0, udd1; // custom values (TBD)
}s;
}CUSTOMS;
struct Header // exactly 128 bits
{
u32 version;
u32 stamp; // creation time
CUSTOMS customs; // properties
}
#pragma pack() // this pragma restores the **default** alignment
*
これは実際にはコードのバグではなく、深刻な構成の間違いであるため、この説明が役立つことを願っています。微妙なコンパイラオプションにあるため、検出が困難です。全てに感謝、
-
*
メモリを適切に動的に割り当てます。
ここでの問題は、メモリをプロパリーに接続することだと思います。これが意味するのは、Freed Memoryを使用しようとしている可能性があるということです。申し訳ありませんが、これ以上助けられません。おそらく実際のコードを追加できます。
これについて私の作業を取ります - 私はメモリを適切に動的に割り当てます。
しかし、あなたはあなたのバッファーがすべて正しいサイズであると確信していますか free()
それらは適切に?ダブルフリーとバッファオーバーフローは、引き起こす可能性のあるヒープの破損に簡単につながる可能性があります malloc()
あらゆる方法で失敗する。
管理構造が内部で使用される場合 malloc()
破損して、通常、すぐにエラーにつながることはありません。しかし、後で呼び出します malloc()
また free()
これらの損傷した構造を使用しようとすると、不安定なことが失敗します。
配列でmalloc()を使用していますか?私が 考える エラーは、あなたが割り当てるのを忘れているかもしれません 最後の余分なメモリの位置 - 何が起こるかは、その場所に手紙を書こうとしますが、それは割り当てられていません。そして、すでに解放されている場所に書き込もうとしていると仮定します。