我在弄清楚如何删除作业中的对象数组时遇到了麻烦.
宣言如下:
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];
我无法弄清楚为什么会发生这种情况以及如何正确删除这个数组.如果没有,我只会手动输入:删除gCharacter [从0到63],但这看起来很混乱.
这固定了
for(int i = 0; i < 180; i++){
gCharacter[i] = 0;
delete gCharacter[i];
}
此错误:_BLOCK_TYPE_IS_VALID(pHead-> nBlockUse)
但我不知道为什么我必须先设置NULL值.
最佳答案 鉴于您发布的代码有限,有两个明显的情况,您将在循环中获得断言:
1)64个指针中的一个(或多个)未正确初始化.如果您最初没有将指针初始化为NULL,并且没有为每个指针调用new而没有例外,那么64个删除中的一个将失败,因为它将尝试释放尚未分配的内存(删除NULL指针有效且什么也不做,但没有断言)
2)64个指针中的一些指向同一个Sprite实例.在这种情况下,当第一个指针被删除时,第二个指针仍然指向相同的存储器地址,该存储器地址已经被解除分配(并且在此期间甚至可能为了不同的目的而重新分配).对同一内存地址的第二次删除将失败,并且无双重断言.
显然有其他情况你可以得到一个断言,但你没有发布足够的代码来彻底调试,我列出的2是最常见的.