我有一个像这样的析构函数:
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 是一个动态分配的数组,其中包含包含可交互对象的图 block 。它的声明如下所示:
tileArray = new Tile[mapWidth*mapHeight];
每当我删除代码的双 for 循环部分并留下这个:
Tilemap::~Tilemap(void)
{
if(width>0 && height > 0)
{
SAFE_DELETE_ARRAY(tileArray);
}
}
我遇到内存泄漏,因为有一个我声明的可交互对象没有被删除。但是,当我离开双 for 循环时,代码可以很好地通过 for 循环,但随后会在 SAFE_DELETE_ARRAY 上崩溃并显示以下错误消息:
Unhandled exception at 0x008927CC in Spaceship.exe: 0xC0000005: Access violation reading location 0xFEEEFEEE.
有谁知道解决这个问题的方法吗?
最佳答案
一个非常简单的模式:让您的 tile 对象的析构函数删除它们的 Interactable 对象(如果有的话)。这样删除一个图 block 会自动清理,你不必在外面担心这个。
或者对 Tile 类引用的对象使用某种类型的智能指针而不是原始指针。
关于c++ - 删除数组内对象内的动态分配对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17118244/