使用for循环删除对象数组

时间:2012-05-02 14:19:31

标签: c++ algorithm memory-management memory-leaks

我在弄清楚如何删除作业中的对象数组时遇到了麻烦。

声明如下:

Sprite*     gCharacter[64] ;

然后在WndProc函数中。

case WM_DESTROY:
        for(int i = 0; i < 64;i++){
            delete gCharacter[i];
        }
        delete gBackground;
        delete gBackBuffer;
        DeleteDC(ghSpriteDC);
        PostQuitMessage(0);
        return 0;

有了这个for循环,我得到了断言错误,就像我会尝试这样的东西:

delete gCharacter[0];
delete gCharacter[0];

我无法弄清楚为什么会发生这种情况以及如何正确删除此数组。如果没有,我只会手动输入:delete gCharacter[from 0 to 63]但这看起来很混乱。

此修复

for(int i = 0; i < 180; i++){
            gCharacter[i] = 0;
            delete gCharacter[i];
        }

此错误:_BLOCK_TYPE_IS_VALID(pHead->nBlockUse) 但我不知道为什么我必须先设置NULL值。

1 个答案:

答案 0 :(得分:2)

鉴于你发布的代码有限,有两个明显的情况你会在循环中得到一个断言:

1)64个指针中的一个(或多个)未正确初始化。如果您最初没有初始化指向NULL的指针,并且没有毫无例外地为每个指针调用new,那么这64个删除中的一个将会失败,因为它会尝试尚未分配的空闲内存(删除NULL指针有效且无效,但未断言)

2)64个指针中的一些指向同一个Sprite实例。在这种情况下,当第一个指针被删除时,第二个指针仍然指向相同的存储器地址,该存储器地址已经被解除分配(并且在此期间甚至可能为了不同的目的而重新分配)。对同一内存地址的第二次删除将失败,并且无双重断言。

显然有其他情况你可以得到一个断言,但你没有发布足够的代码来彻底调试,我列出的2是最常见的。