ページ 11

listで要素を追加するとおかしくなる

Posted: 2010年11月03日(水) 19:31
by bbcs
タイトルの通りです。

オブジェクト用のリストに自機のクラスをpush_backしてから
敵のクラスをpush_backすると
メインループで自機の関数は実行されずに最後にpush_backした敵の関数がリストの要素分実行されます

実行画面をよーく見てみると、
敵が重なって二体に増えているようです
自機のクラスが後にpush_backした
敵のクラスに上書きされているのかもしれません

とにかく、言葉だと伝わらないと思うのでプロジェクトファイルをアップしました
どなたか原因の解明をお願いします

http://www1.axfc.net/uploader/File/so/53616.zip&key=s

Re:listで要素を追加するとおかしくなる

Posted: 2010年11月03日(水) 20:13
by うしお
ポインタを格納するリストに、
push_back(&Cplayer(160,200,GPH_main[0],32,32,32,32,5));
しています
この場合、
Cplayerは一時オブジェクトとして生成され、push_back関数が終了時に開放されてしまいます。
つまり、listに無効なポインタがpushされてしまいます。

これを防ぐためには
newを使い、ヒープメモリにオブジェクトを生成するか、
実体を格納するlistを使うかの2択になります

Re:listで要素を追加するとおかしくなる

Posted: 2010年11月03日(水) 20:28
by うしお
追記ですが、
Cplayer Player1(160,200,GPH_main[0],32,32,32,32,5);
push_back(&Player1);
とすれば、一応Player1の寿命がつづく限り、listのポインタは生きていて、
使うこともできます
大事なのは、やり方というよりも、
オブジェクトの寿命を把握する所かなと思います

Re:listで要素を追加するとおかしくなる

Posted: 2010年11月03日(水) 22:13
by bbcs
うしおさん、すばやい回答ありがとうございます

生成されてすぐに開放されているとは思いませんでした・・・
push_back(new Cplayer(160,200,GPH_main[0],32,32,32,32,5));
に書き換えたら上手くいきました。

ありがとうございました!