我正在使用双指针但是当我尝试删除它时会导致堆损坏: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),不确定这是否有所不同,但似乎直到现在才有效。
答案 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/
然后接受你的代码并开始修剪它们,直到代码很简单,但仍然表明你的堆损坏。在删除不相关的代码时保留每个版本的副本,这样就不会跳过发生问题的部分(这是您希望版本控制系统甚至在您的个人项目中的众多原因之一)。