C++ 删除数组中对象内部的动态分配对象

C++ 删除数组中对象内部的动态分配对象,c++,dynamic,memory-leaks,delete-operator,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(getTileAt

我有一个类似这样的析构函数:

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;
}
#define SAFE_DELETE_ARRAY(ptr) { if(ptr) { delete [](ptr); (ptr)=NULL; } }
tileArray = new Tile[mapWidth*mapHeight];
TilerRay是一个动态分配的数组,其中包含包含可交互对象的Tile。其声明如下:

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;
}
#define SAFE_DELETE_ARRAY(ptr) { if(ptr) { delete [](ptr); (ptr)=NULL; } }
tileArray = new Tile[mapWidth*mapHeight];
每当我删除代码的double for loop部分并保留以下内容时:

Tilemap::~Tilemap(void)
{
    if(width>0 && height > 0)
    {
        SAFE_DELETE_ARRAY(tileArray);
    }
}
我得到内存泄漏是因为有一个我声明的可交互对象没有被删除。但是,当我离开double for循环时,代码可以顺利通过for循环,但随后在SAFE_DELETE_数组上崩溃,并显示以下错误消息:

Spaceship.exe中0x008927CC处的未处理异常:0xC0000005:访问冲突读取位置0xFEEEFEEE


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

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


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

非常感谢!我只是看了看,我的互动程序已经在删除可交互的内容,所以它们被删除了两次。对于这样一个简单的问题,那是浪费了很多时间。非常感谢。这里的两个建议(析构函数v智能指针)做了非常不同的事情。智能指针将释放父对象,但不会释放属于所述父对象的任何动态分配内存。另外,如果你要实现你自己的析构函数,你应该遵循三条规则。调试你的程序,发现我们没有足够的信息来做这件事。使用智能指针和容器,问题就会自行解决。此外,您还可以删除空指针;它什么也不做。