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

标签 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 是一个动态分配的数组,其中包含包含可交互对象的图 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/

相关文章:

c++ - 正确放置枚举类的哈希表

c++ - eclipse cdt : add include path from pkg-config

c - 使用动态数组的段错误

java - 分析Java PS Old Gen和可能的内存泄漏

.net - 在单元测试中检测终结异常

c++ - 在继承自 QGraphicsView 的类中使用 QGraphicsSceneMouseEvent

C++ "virtual"关键字放置

javascript - 在 php javascript 之后动态插入行

android - Android GridView 中的图像发生变化。如何?

java - 为什么这会在旋转时泄漏?