NEST :: laboratory RSSフィード

引っ越しました。

http://ginpen.com

基本的にこちらの内容は残しておきます。
ただいくつかの記事については向こうへ持って行こうと思っています。


カレンダー
<< 2007/05 >>
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31

本家はこちら: NEST http://nest.l-w-l.info

. archive / . bookmark

HTML, CSS, JavaScript中心に興味あることあれこれを扱う技術系blogです。昔はそうでなかったので、古いのには妙なものも混ざってるかもしれません。

なお全ては自分が理解した事の覚書的文書であるため、事実に反する場合があります。気付かれた方はご指摘頂ければと思います。

書いてる人 : 高梨ギンペイ@横浜でSEやってます。Twitter→@ginpei_jp

2007/05/01

[][] 「ヒープが壊れていることが原因として考えられます。」の原因は二重deleteかも

VC++デバッグ中に

HEAP[hoge.exe]: Invalid Address specified to RtlFreeHeap( 00000000, 00000000 )
Windows によって hoge.exe でブレークポイントが発生しました。

ヒープが壊れていることが原因として考えられます。hoge.exe または読み込まれた DLLバグがあります。

可能であれば、出力ウィンドウに詳細な診断情報が表示されます。

と表示され、msize.cの88行目(下記)でブレーク。

retval = (size_t)HeapSize(_crtheap, 0, pblock);

領域の開放に失敗しているようだが、どうやら既にdeleteしたものをさらにdeleteしようとしたのがよくないようだ。

C++の仕様では、既に開放した領域をdeleteした場合の動作は未定義*1であるらしい。そしてdeleteしても領域が開放されるだけ*2で、ポインタNULLになるわけではない

NULLをdeleteしても何も起こらないようにはなっているので、目の前でnewしてdeleteするものでなければ、とりあえずNULLを代入しておいても良いかもしれない。無駄な記述ならコンパイラ最適化の際に削ってくれるかもしれないし。

以下、問題を再現するごくごく簡単なコード。

int main(void)
{
	char *hoge = new char;
	delete hoge;
	delete hoge;	// ここで問題発生する「かも」

	return 0;
}

詳しくは、google:二重delete

# 『スマートポインタを使うと良い』という話を聞いた

*1:未定義なので問題は起きるかもしれないし、起きないかもしれない。

*2:クラスならデストラクタも呼ばれるけど。

fusatsukatsujinfusatsukatsujin 2007/05/02 01:45 deleteしたら、ポインタに0を代入するのは基本。
おれはそうする癖をつけている。
Javaでも使い終わったオブジェクトの参照には、0を代入しておくと良い。

ginpeiginpei 2007/05/02 14:37 deleteしたものはNULLにしてくれるものとばかり思ってました。
してくれてもいいのになあ。

名無し名無し 2014/10/07 11:07 NULL代入にもコストがかかる上級者はミスをしないが前提の動作。
(実際には色々やらかす)組み込みなどで限られた命令数で組むときにも、勝手に初期化しないのは重要

スパム対策のためのダミーです。もし見えても何も入力しないでください
ゲスト

コメントを書くには、なぞなぞ認証に回答する必要があります。

トラックバック - http://d.hatena.ne.jp/ginpei/20070501/1178031566

Connection: close