4

我无法弄清楚如何删除作业中的对象数组。

声明如下所示:

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 值。

4

1 回答 1

2

鉴于您发布的代码有限,有两种明显的情况会在循环中获得断言:

1) 64 个指针中的一个(或多个)未正确初始化。如果你一开始没有初始化你的指针NULL,并且没有一一调用new它们中的每一个,那么这 64 个删除中的一个将失败,因为它会尝试释放尚未分配的内存(删除NULL指针是有效并且什么都不做,但不断言)

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

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

于 2012-05-02T14:59:36.200 回答