在数组内的对象内删除动态分配的对象

Deleting a dynamically allocated object inside of an object inside of an array

本文关键字:对象 动态分配 删除 数组      更新时间:2023-10-16

我有一个析构函数,看起来像这样:

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是一个动态分配的数组,其中包含包含可交互对象的tile。它的声明看起来像这样:

tileArray = new Tile[mapWidth*mapHeight];

每当我删除代码的双for循环部分时,只留下这个:

Tilemap::~Tilemap(void)
{
    if(width>0 && height > 0)
    {
        SAFE_DELETE_ARRAY(tileArray);
    }
}

我得到内存泄漏,因为有一个我声明的可交互对象没有被删除。然而,当我离开双for循环时,代码可以顺利通过for循环,但随后在SAFE_DELETE_ARRAY上崩溃,并显示以下错误消息:

未处理的异常在0x008927CC在宇宙飞船.exe: 0xC0000005:访问违反读取位置0xFEEEFEEE.

有人知道解决这个问题的方法吗?

一个非常简单的模式:让你的tile对象的析构函数删除它们的可交互对象(如果它们有)。这样一来,删除瓷砖就会自动清理,你就不用担心这个问题了。

或者使用某种类型的智能指针而不是原始指针来指向Tile类所引用的对象。