2014-09-18

関数の仕組み

 これはゲーム製作における実際の方法とかではなくて、プログラムの仕組みの話になります。初心者時代に引っかかっていた部分なので、いまとなってはこんな事は当たり前になってますが、まだちょっと飲み込めてない人もいるかもしれないし、こういう話しもいいでしょう。

続きを読む »

スポンサーサイト



2014-09-21

スマートポインタ

 今回の話は初心者向けのテクニックではなくて、今しがた解決したバグの感想です。

 私は○×さんのところのスマートポインタを使わせていただいているわけですが、いまだにこれの使い方が分からない事があります。基本的な用法は分かってきたのですが、まだまだバグを出してしまいます。
 スマートポインタで出しやすいバグは、

1、消さないはずのインスタンスを消してしまう
2、消してあるはずのインスタンスが残ってしまう

 あたりでしょうか。
 1のほうは、めんどくさがらずに全部の受け渡しをスマートポインタでやれば解決します。ここはスマートポインタじゃなくても大丈夫だからとか言って生ポインタを渡したりしてるとバグが出てきます。ヘッダを循環参照したくなったときとかは、生ポインタなら前方宣言で解決しますが、スマートポインタの場合は未定義だといって怒られます。私はこれの回避のためにウィークポインタを使うようにしてあります。
 こっちはちょっと使い方に注意が必要なのであまり使わないようにしてますが仕方ない。

 先ほどのバグは2のタイプでした。
 objectlistに入っているObjectのうち、選択されているものを別なところで、選択されているObjectとして保管していたわけですが、あるタイミングでobjectlistをクリアすることになってました。そしてすぐにほとんど(見た目的にはまったく)同じものを登録しなおすわけです。
 私の中ではいま選択しているObjectはその登録しなおしたものになっていましたが、実際は選択されているObjectはクリア前のものでした。スマートポインタを使わない場合は、objectlistを空にする処理と同時に中身のポインタをdeleteする処理も入れます。そのため、この手の処理を作った場合にはメモリの保護違反で落とされます。
 表示されるはずの物が表示されないケースの方が、原因は特定しやすい気がします。表示されないはずの物が表示されるケースは、どこが悪さをしているのか可能性が多すぎて見つけるのに苦労します。

 まぁ、今回の経験で、ないはずのものが出てきた場合は、それとそっくりなものを受け取っているスマートポインタを疑うことを学習しました。次はもうちょっと早く解決できるといいなぁ。

Copyright (C) 旅の雲. All rights reserved. Template by Underground