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 是从对象“Sprite”继承的“Tile”对象,则所有 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/

然后拿出你的代码并开始修剪它的部分,直到代码很简单,但仍然显示你的堆损坏。在删除不相关的代码时保留每个版本的副本,这样您就不会跳过出现问题的部分(这是即使在您的个人项目中也需要版本控制系统的众多原因之一)。

于 2013-01-20T19:46:56.043 回答