我在弄清楚如何删除作业中的对象数组时遇到了麻烦。
声明如下:
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值。
答案 0 :(得分:2)
鉴于你发布的代码有限,有两个明显的情况你会在循环中得到一个断言:
1)64个指针中的一个(或多个)未正确初始化。如果您最初没有初始化指向NULL
的指针,并且没有毫无例外地为每个指针调用new
,那么这64个删除中的一个将会失败,因为它会尝试尚未分配的空闲内存(删除NULL
指针有效且无效,但未断言)
2)64个指针中的一些指向同一个Sprite
实例。在这种情况下,当第一个指针被删除时,第二个指针仍然指向相同的存储器地址,该存储器地址已经被解除分配(并且在此期间甚至可能为了不同的目的而重新分配)。对同一内存地址的第二次删除将失败,并且无双重断言。
显然有其他情况你可以得到一个断言,但你没有发布足够的代码来彻底调试,我列出的2是最常见的。