* 川合のプログラミング言語自作のためのテキスト第四版#002 -(by [[K]], 2026.06.01) --目次はこちらです。→[[a26_txt03]] ** (1) オブジェクトのdeinit忘れ問題 -C++はオブジェクト指向言語で、コンストラクタを使ってオブジェクトを初期化すると、スコープから抜けるときにはデストラクタを呼んでオブジェクトの後片付け処理をすることができます。・・・でもC言語にはそういう機能はありません。デストラクタも自分でちゃんと呼び出す必要があります。しょうがないです。 -でも本当の問題は「自分でいちいちやらなければいけない」というところではなく、「たまにやり忘れる」というところなのです。・・・デストラクタと書くと長いので、ここでは deinit と書くことにします。 -deinit を忘れると、メモリがたくさんリークしたり、最後に書き出すべき内容が内部バッファにたまったままになっていて失われたり、もうほんとにいいことないです。malloc_chkAll() でいっぱい表示されると、げんなりしてしまいます。しかもそれって実はたった一つのオブジェクトを deinit し忘れているだけだった、なんてこともよくあります(オブジェクトの中に動的確保するメモリが複数あると、こういうことになりやすいです)。 -ということで、 init したときに登録して、deinitしたら登録から消えるようなそんな簡単な仕組みがあれば、きっと便利になるはずです。 -えーまだデバッグ支援機能を作るの?もう飽きたよーと思うかもしれませんが、デバッグ支援機能はこれが最後です(たぶん)。とにかくバグをどんどんつぶしていけるような土台を作って、その上に楽しい機能を作っていくのです。デバッグ時間が短くなるはずなので、遠回りのように見えて、実はゴールには早く到達できるかもしれません。まさに急がば回れですね! ** (2) 大まかな仕組み -このデバッグ支援のためのオブジェクトや関数呼び出しは、デバッグモードの時にしか有効になりません。それ以外の時は自動で消えます。 a_class(a_ObjDbg) { #if (a_DbgLv >= 1) intptr_t i; #endif }; - a_ObjDbg クラスは、中に intptr_t のメンバー変数を1つ持っているだけのとてもシンプルなものです。オブジェクトに関するデバッグ用の様々な情報は、 a_malloc のときのように、別のところに配列で集められていて、この intptr_t はその配列の番号になっています。 -またデバッグレベルが0の場合はこのクラスは0バイトになって、メモリを一切消費しません。 -(以下編集中) * こめんと欄 #comment