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

时间:2013-06-14 22:35:25

标签: c++ dynamic memory-leaks delete-operator

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

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。

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

1 个答案:

答案 0 :(得分:1)

一个非常简单的模式:让tile对象的析构函数删除它们的Interactable对象。这样一来,删除一个磁贴会自动清理,你不必在外面担心这个问题。

或者使用某种类型的智能指针代替Tile类引用的对象的原始指针。