我正在使用双指针,但当我尝试删除它时,它会导致堆损坏: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/