listに入っているオブジェクトのdelete

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

listに入っているオブジェクトのdelete

#1

投稿記事 by ねの » 9年前

こんにちは。

現在STLのlistを用いてシューティングゲームを作っているのですが、オブジェクトのdeleteがうまくいかず困っています。
開発環境はVC2013で、
ソースコードは以下の通りです。

/*ソースコード*/

コード:

class Bullet_Object{
/*省略*/
};

/*メインループ外での宣言*/
list<Bullet_Object> BulletList; //Bullet_Object用リスト作成

/*メインループ内での処理*/
         list<Bullet_Object> BulletCopy;
         list<Bullet_Object>::iterator It_Bullet;
	/* 弾処理 */
	for (It_Bullet = BulletList.begin(); It_Bullet != BulletList.end();){
		It_Bullet->Calc();
		if (It_Bullet->bullet_kind != 100 && It_Bullet->CheckHit(Player)){	//プレイヤーの弾のあたり判定
			Player.hp -= 1;
		}
		
		for (It_Enemy = EnemyList.begin(); It_Enemy != EnemyList.end(); It_Enemy++){
			if (It_Bullet->bullet_kind == 100 && It_Bullet->CheckHit(*It_Enemy)){	//敵の弾のあたり判定
				It_Enemy->hp -= 100;
			}
		}

		if (It_Bullet->state == ALIVE){
			BulletCopy.push_front(*It_Bullet);
			It_Bullet++;
		}
		else{
			//弾のdelete処理を書く。
			Bullet_Object *tmp = &(*It_Bullet);
			It_Bullet = BulletList.erase(It_Bullet);
			delete tmp;
		}
	}
	BulletList.clear();
	BulletList = BulletCopy;


のようにしています。
端的に言えば、listに入っているオブジェクトの計算をした後に、STATE が DEADになったオブジェクトを消去するようにしているのですが…

今のプログラムだとdelete tmpの箇所で実行時にエラーがでてしまいました。
どうやら存在しないオブジェクトを削除しようとしているようです。

お詳しい方のお知恵を借りられたらと思います。

アバター
usao
記事: 1887
登録日時: 11年前

Re: listに入っているオブジェクトのdelete

#2

投稿記事 by usao » 9年前

>list<Bullet_Object> BulletList;

これだとdeleteしちゃまずいのでは?

アバター
h2so5
副管理人
記事: 2212
登録日時: 13年前
住所: 東京
連絡を取る:

Re: listに入っているオブジェクトのdelete

#3

投稿記事 by h2so5 » 9年前

スタック上のオブジェクトをdeleteしてはいけません。
すみません、list上のオブジェクトはスタックじゃないですね...
eraseした時点でlist内部でdeleteされてしまうので、二重解放になっています。

ねの

Re: listに入っているオブジェクトのdelete

#4

投稿記事 by ねの » 9年前

>h2so5様

eraseでdeleteされるのですか!
てっきりリストから要素が削除されるだけでオブジェクトそのものは残っているのかと思っていました。

どうやら自分は勘違いをしていたようで、
listに入れたオブジェクトと入ったオブジェクトがアドレスをかえただけの同一のものだと思っていました。
弾データの挿入の時に新しくnewで生成したオブジェクト自体がアドレスを変えてリストに入るのではなく、リストに完全に新たなオブジェクトが挿入されるんですね…

自分が書いていたのはlist<Bullet_Object*>として、ポインタ型リストを生成した時のものなのでしょうか。

挿入の時に生成したBullet_Object *Bulletを挿入後にdeleteするようにしたら、メモリリークは起らなくなりました。
教えていただき本当にありがとうございました。

閉鎖

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