0

今日、私はグローバルポインタを作成しようとしました:

int *map = new int[M2*N2];

次に、main()関数でこれを削除しようとしました:

delete[] map;
map = NULL;

しかし、すべてのプログラムを実行した後、エラーが発生します:

free(): invalid next size (fast)

それで、そのようなポインタを作成して、それを他の場所で削除することは可能ですか?

編集

その固定。

M2 は M+1 でした (M は配列の制限でした)。M2=M+10 を使用した後、機能しました。

ありがとうございます...

4

1 に答える 1

7

エラーは、メモリ ブロックをクリーンアップしようとしているときに、次のヒープ ブロック用に格納されたサイズが無効であることを示しているようです。この情報は通常、 から取得するポインターの直前の小さなヘッダー ブロックに格納されます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コードの最終修正だと言ったら、彼らをクビにするでしょう。それは、おそらく期限が迫ったときに戻ってきてあなたを噛むのを待っている潜在的なバグにすぎません.

于 2013-05-10T01:11:46.660 に答える