c++ - 删除双指针会导致堆损坏

标签 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 是从对象“Sprite”继承的“Tile”的对象,则所有 3 个析构函数都设置为虚拟的( map 、图 block 、 Sprite ),不确定这是否有任何区别,但似乎直到现在都有效。

最佳答案

您发布的代码似乎没有任何问题。我从中创建了一个简单的、自包含的、编译(和正确的)示例:

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 <- 链接,没有发现任何问题。

您的问题在于您没有与我们共享的代码。为了找到导致问题的代码并提出正确的问题,请转到此处:http://sscce.org/

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

关于c++ - 删除双指针会导致堆损坏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14428026/

相关文章:

c++ - 套接字和多线程

c - getc() 中的段错误

c - 访问冲突

c - 尝试使用指针在冒泡排序上编写程序时出现编译错误

c - 重新分配与其偏移量不同的已分配内存块

linux - 什么是内存映射页和匿名页?

c++ - 如何使用 opencv 查找手动定义地标的描述符

c++ - 命名空间 'std' 中的“bad_cast”未命名类型错误

c++ - 使用 Boost.Asio 强制异步套接字读取提前完成

php - 如何修复 PHPExcel 耗尽的内存?