我有一个看起来像这样的析构函数:
Tilemap::~Tilemap(void)
{
if(width>0 && height > 0)
{
for (int x = 0; x < getMapWidth(); x++)
{
for (int y = 0; y < getMapHeight(); y++)
{
if(getTileAtPoint(x,y)->isInteractable())
{
delete getTileAtPoint(x,y)->getInteractable();
}
}
}
SAFE_DELETE_ARRAY(tileArray);
}
return;
}
SAFE_DELETE_ARRAY()只是一个如下所示的宏:
#define SAFE_DELETE_ARRAY(ptr) { if(ptr) { delete [](ptr); (ptr)=NULL; } }
tileArray是一个动态分配的数组,其中包含包含可交互对象的切片。它的声明如下:
tileArray = new Tile[mapWidth*mapHeight];
每当我删除代码的双重for循环部分时,只需保留:
Tilemap::~Tilemap(void)
{
if(width>0 && height > 0)
{
SAFE_DELETE_ARRAY(tileArray);
}
}
我得到内存泄漏,因为我声明有一个可交互的对象没有被删除。但是,当我离开双重for循环时,代码使它通过for循环就好了,但随后在SAFE_DELETE_ARRAY上崩溃并显示以下错误信息:
Spaceship.exe中0x008927CC处的未处理异常:0xC0000005:访问冲突读取位置0xFEEEFEEE。
有人知道解决这个问题的方法吗?
答案 0 :(得分:1)
一个非常简单的模式:让tile对象的析构函数删除它们的Interactable对象。这样一来,删除一个磁贴会自动清理,你不必在外面担心这个问题。
或者使用某种类型的智能指针代替Tile类引用的对象的原始指针。