実にえらいミスです。
概要は、こちら。
それにしてもtry~catchが効かないってのは痛い。
catchできてれば、狭めていくことで分かるのに。
#いや、catchでスタックトレースすれば一発か?
今回は、トレースを入れて、どこまで出続けるかを追っていくという超アナログな方法を採用したため、非常に時間が掛った。
いや、言い訳に過ぎない。
少なくとも、自分で書いたコードは、分かっていなきゃいけない。
不明な例外とか、本来は出しちゃいけない。
で、今回の原因は、初期化漏れと、ビット演算時のマスク定数誤りが原因なわけだが。
初期化漏れに関しては、構造体をnewした際にコンストラクタがないため、不定なメモリ状態になっていた。
今後これを起こさないためには、structに対しても必ずコンストラクタを用意すること。
もうひとつのビット演算時のマスク定数誤りは・・・やはり単純にマスク後の値を見れば分かるはずだ。
#が、漏れちゃった・・・
0x0FFFのつもりが、コード見たら、0x0FFFFになってるなんざ、よほど抜けてるなぁ・・・
にしても、不具合報告が一件も無かったんですが、これ発生条件って稀なのかなぁ。
#いや、ほとんど使用されていないってのが現実か。
デバッグビルドで発生しなかったのは、おそらく、newで確保したメモリの初期化がおこなわれていたからだと思われ。
メモリリークは発生していたはずなんだけど、これもデバッグ実行時の報告に挙がってない・・・ってことはデバッガも万能じゃないってことか?設定ミスかも。
何はともあれ、不具合が潜在状態から顕在状態になったことは良いこと。
直すことができるから。
さぁ、直すぜ!
コメントしちゃいなよ