删除双指针会导致堆损坏

时间:2013-01-20 18:56:07

标签: c++ pointers memory-management

我正在使用双指针但是当我尝试删除它时会导致堆损坏: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是一个“Tile”的对象,它继承自一个对象“Sprite”,所有3个析构函数都被设置为虚拟(map,tile,sprite),不确定这是否有所不同,但似乎直到现在才有效。

1 个答案:

答案 0 :(得分: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;
}

compiled and ran it&lt; - 链接,并没有发现任何不良内容。

您的问题在于您未与我们分享的代码。要查找导致问题的代码并提出正确的问题,请转到此处:http://sscce.org/

然后接受你的代码并开始修剪它们,直到代码很简单,但仍然表明你的堆损坏。在删除不相关的代码时保留每个版本的副本,这样就不会跳过发生问题的部分(这是您希望版本控制系统甚至在您的个人项目中的众多原因之一)。