エラーは、メモリ ブロックをクリーンアップしようとしているときに、次のヒープ ブロック用に格納されたサイズが無効であることを示しているようです。この情報は通常、 から取得するポインターの直前の小さなヘッダー ブロックに格納されますnew
。
...--+----------------+--------+----------+------------+------------+--...
| previous block | block | block | next block | next block |
| data | header | data | header | data |
...--+----------------+--------+----------+------------+------------+--...
^ ^
| |
new[] returns pointer here -----+ |
You probably wrote into here --------------+
meaning the OS can no longer find blocks after there.
配列の境界外のメモリに書き込んでいるに違いありません。つまり、以下0
または以上のインデックスにアクセスしていますM2*N2
。(次のヒープ ブロック ヘッダーが破損していると訴えているため、おそらく後者のケースです。)
free()
不満がなくなるまで、コードの一部をオフにします。次に、オフにした部分を再び開始するまでオンにします。問題の原因となっている行を数行または 1 行に絞り込み、修正します。
編集:より大きな配列が問題を回避すると判断したので、それは修正されません-配列の「範囲外」部分を既知の定数に初期化する必要があります(数値、できればありそうもない数値を選択してください)データに含まれる)、プログラムの最後に、どの範囲外の要素が変更されたかを確認できます。
最終的に、あなたのコードが で動作しない場合、int *map = new int[M*N];
それは欠陥のあるコードです。部下の 1 人がM2=M+10
コードの最終修正だと言ったら、彼らをクビにするでしょう。それは、おそらく期限が迫ったときに戻ってきてあなたを噛むのを待っている潜在的なバグにすぎません.