2012-05-02 9 views
4

私は宿題でオブジェクトの配列を削除する方法を理解するのに問題があります。 WndProc関数のforループによるオブジェクト配列の削除

Sprite*  gCharacter[64] ; 

そして:

宣言は次のようになります。このforループで

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

私はこのような何かしようとするだろう場合のようなアサーションエラーを取得:起こって、どのように適切にこのアレイを削除することで、なぜ私が理解することはできません

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値を設定する必要がない理由はわかりません。あなたが投稿限られたコードを考える

+2

この配列の入力方法について説明できますか?すべてのオブジェクトはユニークですか? –

+0

アサーションエラーだけでなく、 'gBackground'、' gBackBuffer'および宣言していない他の変数の宣言も投稿してください。同じ割り当てから2回同じセクションを削除することはできません。また、(私は、多くのケースを知っています)、gCharacterはどのように割り当てられましたか?彼らは 'new'や' malloc'を使いましたか?これは明らかにWin32であり、組み込み関数の中には、演算子 'new'と同じ方法で解放されない古いC関数を使用するものがあります。 –

+1

各配列インデックスに有効なスプライトポインタがあることを確認してください。また、それらが明確であることを確認してください。例。 (int i = 0; i <64; ++ i)gCharacter [i] = newスプライト(...)の初期化。 – marcinj

答えて

2

、あなたがループ内でアサーションを得るでしょう2明白な例があります:

1)つ(またはそれ以上)あなたの64のポインタのは、適切に初期化されていません。最初にNULLへのポインタを初期化せず、例外なくそれぞれ1つにつきnewを呼び出さないと、割り当てられていないメモリを解放しようとするため、64個の削除のうちの1つが失敗します。 NULLポインタは有効で何もしませんが、アサートしません)

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

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