1

次のコードは、デバッガーがdelete[]オペレーターにヒットするたびにヒープの破損を引き起こしているようです。ヘッダーファイルでとして定義されextern、メインの.cppファイルのグローバルスコープで宣言された構造体のグローバル配列を削除しようとしています。

LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
{ 
  switch(msg) 
  { 
    case WM_CREATE: 
      { 
        int main_win_x, main_win_y;

        tiles_horiz = 10;  //temp code
        tiles_vert = 10;   //temp code
        num_mines = 5;    //temp code

        main_win_x = (tiles_horiz * 22) + 20;
        main_win_y = (tiles_vert * 22) + 20;

        MoveWindow(hwnd, 100, 100, main_win_x, main_win_y, TRUE);

        tiles_total = (tiles_horiz * tiles_vert);
        tile_array = new tile[tiles_total];

        SetupPlayField();
        DrawInitTiles(hwnd);
      }
      break;
    case WM_SIZE:
      {

      }
      break;
    case WM_CLOSE:
      delete[] tile_array;
      DestroyWindow(hwnd);
      break;
    case WM_DESTROY:
      PostQuitMessage(0);
      break;
    default:
      return DefWindowProc(hwnd, msg, wParam, lParam);
  }
  return 0;
}

私はここ数日、フォーラムでさまざまなヒープ破損のトピックを検索しましたが、これまでのところ、さまざまなことを試してみました。

ある人は、プログラムがヒットするまでに、私の配列tile_arrayへのポインタが変更された可能性があると提案しましたdelete[]。しかし、私はこれを数回チェックしましたが、ポインターと配列の最初の要素の両方のアドレスは同じままです。

他の人の投稿からの他のフォーラムの回答は、通常、配列を複数回削除する可能性があることを示唆していますが、これまでのところ、delete[]演算子がその特定の配列に使用されるのはこれだけです。

4

1 に答える 1

1

title_arrayへのすべてのアクセスを知らなければ、この問題の原因を推測することは困難です。プログラムが表示されるメモリの破損は、必ずしもそれを引き起こしたものではありません。

確認したいことの1つは、extern宣言が「tile * tile_array」に対するものであり、「tiletile_array[]」に対するものではないことです。私はこれが事実であるとは非常に疑っていますが、externとarrayを扱うとき、私はこの間違いが数人の人々を噛むのを見ました。

もう1つ行うことは、tile_arrayを削除した後、宣言するときに必ずNULLにすることです。これを行ったときに問題が解決した場合は、実際には、削除が早すぎるか(初期化される前)、削除が多すぎます。

最後に再確認する必要があるのは、バッファーのオーバー/アンダーランがないことです。new []演算子は、delete []演算子が配列のサイズを知るために使用するヒープにメタデータを配置して、メモリを適切にクリーンアップできるようにします。このメタデータを破損すると、ヒープが破損する可能性があります。

于 2012-09-08T00:34:06.283 に答える