0

ダブル ポインターを使用していますが、それを削除しようとすると、ヒープの破損が発生します。CRT は、アプリケーションがヒープの終了後にメモリに書き込んだことを検出しました。オブジェクトのデストラクタ内で「クラッシュ」します。

Map::~Map()
{
    for(int i = 0; i < mTilesLength; i++)
        delete mTiles[i];

    delete[] mTiles;
}

mTiles は次のように宣言されます。

Tile **mTiles = NULL;
mTiles = new Tile *[mTilesLength];

for(int i = 0; i < mTilesLength; i++)
    mTiles[i] = new Tile(...);

注目すべき mTiles がオブジェクト「スプライト」から継承する「タイル」のオブジェクトである場合、3 つのデストラクタすべてが仮想 (マップ、タイル、スプライト) として設定されます。

4

1 に答える 1

1

投稿したコードには問題がないようです。私はそれから単純な自己完結型のコンパイル(そして正しい)例を作成しました:

struct Tile {int x; Tile():x(7) {}};

struct Map {
  Tile **mTiles;
  int mTilesLength;
  Map(int TilesLength_);
  ~Map();
};
Map::~Map()
{
  for(int i = 0; i < mTilesLength; i++) {
    delete mTiles[i];
  }

  delete[] mTiles;
}
Map::Map(int TilesLength_):
  mTiles(),
  mTilesLength(TilesLength_)
{
  mTiles = new Tile *[mTilesLength];

  for(int i = 0; i < mTilesLength; i++) {
    mTiles[i] = new Tile();
  }
}
int main() {
  Map* m = new Map(1000);
  delete m;
}

私はそれをコンパイルして実行しました<-リンク、そして悪いことは何も気づかれませんでした。

あなたの問題はあなたが私たちと共有していないコードにあります。問題の原因となっているコードを見つけて正しい質問をするには、http ://sscce.org/にアクセスしてください。

次に、コードを取り出して、コードが単純になるまでパーツのトリミングを開始しますが、それでもヒープの破損を示します。問題が発生した部分をスキップしないように、無関係なコードを削除するときに各バージョンのコピーを保持します(これは、個人のプロジェクトでもバージョン管理システムが必要な多くの理由の1つです)。

于 2013-01-20T19:46:56.043 に答える