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

投稿した限られたコードを考えると、ループでアサーションを取得する明らかなケースが 2 つあります。

1) 64 個のポインターの 1 つ (または複数) が正しく初期化されていません。最初にポインターを初期化せず、例外なくすべてのポインターをNULL呼び出さないnew場合、割り当てられていないメモリを解放しようとするため、64 回の削除のいずれかが失敗します (NULLポインターの削除は有効で何もしませんが、アサートしません)

Sprite2) 64 個のポインターの一部が同じインスタンスを指しています。その場合、最初のポインターが削除されても、2 番目のポインターは、既に割り当てが解除されている (その間に別の目的で再割り当てされることさえある) 同じメモリ アドレスを指し続けます。同じメモリ アドレスに対するこの 2 番目の削除は、ダブル フリー アサーションで失敗します。

アサーションを取得できる状況は明らかに他にもありますが、完全にデバッグするのに十分なコードを投稿していません。リストした 2 つは最も一般的なものです。

于 2012-05-02T14:59:36.200 に答える