ポインタバグでたー

あい、C++につきもののいつものやつ…。

というわけではなくて、全般的なはなし。C++だとまあ、ポインタなんだけど、特定のオブジェクトの実体をつかんでおいて、後で使うってのはよくあること。実はこれ、かなり悩ましい。というのは、本当に実体をつかんでおくってのは実は無理で、ポインタとか間接参照するのが精一杯。知らぬ間に自己消滅された瞬間に、手元に残っているポインタはゴミとなってしまう。ゴミになるくらいならまだいいのですが、それがゴミであるか正当なものであるのかの判断は当人には出来ないというのが始末に終えない。つうことで、自殺する祭には使用者にわざわざコールバックする仕組みまで作ってしばらく平穏に暮らしてたのですが、また問題が発生したと言うわけです。

当たり判定は一種の割り込み処理扱いにしたのですが、それが故に、当たり判定中にオブジェクトを殺したり生成したりするとまずい(片方だけならOK)。当たり判定中で敵のライフを減らす処理をするからには当然あたり判定中にキャラを殺してるわけで。従って、当たり判定中にはキャラを生成できない!即ち、打ち返し弾が実装できないことが判明したのでした…(苦しい処理書けばできるけど)。以上、自己メモ。

なお、参照を安全に行うにはハンドル(ポインタ+ユニークID*1)を使えばOKではあるのですが…、キャラを触るたびに毎回ハンドルを使うのも取り回しが悪くてやだなぁ…。

*1:ユニークIDによって妥当性をチェックした後でポインタを使う