ハンドルについて

http://www2.tky.3web.ne.jp/~yosshin/memo/000213.html

おかしいなあ、確かこのページみてハンドルを知ったはずなんですが、間違って覚えてました。ハンドルは、ポインタテーブルを別にもち、そこにある実ポインタを参照/破棄してやることで実装するのが多いみたいです。検索したら、そんな感じでした。良く考えたら、確かにそうだ。

私の場合はちょっと違ってて、キャラクタをプールにおいて使いまわしする設計にしてますので、不正ポインタが発生することはありません。が、手元にあったポインタの実体が知らない間に破棄されていて、さらに知らない間に別のキャラとして生成された時に不具合が起こります。知ってるアイツと思って弄ってたら、実は他人でした、と。こいつを解決するのに、オブジェクト生成(プールから取得)する際にユニークIDを発行し、キャラに登録。ポインタを持ってるひとは、一緒にIDも確保しておき、使用時にIDを使ってチェックを行う。キャラが使用中で無い時またはIDが異なる場合はポインタの対象は既に死んでいると判定できるわけです。

ポインタとIDのセットを持ったクラスを定義しておいて、演算子オーバーロードを使って自動で妥当性チェックするようにしておくと便利かもしれません。私は、残念ながら、そうはしてませんが。なぜなら、オブジェクトのポインタを整数型にキャストして汎用(整数)バッファに格納するとか破廉恥な真似をしているからです。ポインタ+IDで2語になっちゃいますからね…。