0

我有一个如下所示的析构函数:

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。

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

4

1 回答 1

1

一个非常简单的模式:让你的 tile 对象的析构函数删除它们的 Interactable 对象(如果它们有的话)。这样删除磁贴会自动清理,您不必担心外部问题。

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

于 2013-06-14T22:39:59.750 回答