読者です 読者をやめる 読者になる 読者になる

堕(惰)プログラマ開発記録

タイトル変えようかなとも思ってるけれど,思い浮かばない

「ヒープが壊れていることが原因として考えられます。」の解消

C++

今日この罠に、はまりました。
ただ中でnewしてdeleteする関数を呼んだだけなのですがね。

void hoge(){
  char *test = new char;

  delete test;
  delete test;  //ここで発生する可能性がある
}

こんなコードを書くと、

HEAP[hoge.exe]: Invalid Address specified to RtlFreeHeap( 00000000, 00000000 )
Windows によって hoge.exe でブレークポイントが発生しました。ヒープが壊れていることが原因として考えられます。
hoge.exe または読み込まれた DLL にバグがあります。可能であれば、出力ウィンドウに詳細な診断情報が表示されます。

これが表示される「可能性がある」ようです。


理由は「既に解放した領域のdeleteの動作は未定義」であること。
ポインタがNULLになる保証はないとのことのようです。
これがされないためにエラーになるそうなので、
delete後にはポインタにNULLを代入すれば解決とのこと。
NULLのポインタdeleteが無効になるそうで。


まあいち早い解決は、スマートポインタを使うこと。
勝手に解放処理してくれるのでメモリ管理が簡単です。