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

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
bbcs

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

#1

投稿記事 by bbcs » 14年前

タイトルの通りです。

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

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

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

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

うしお

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

#2

投稿記事 by うしお » 14年前

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

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

うしお

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

#3

投稿記事 by うしお » 14年前

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

bbcs

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

#4

投稿記事 by bbcs » 14年前

うしおさん、すばやい回答ありがとうございます

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

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

閉鎖

“C言語何でも質問掲示板” へ戻る