ベクトルstd::vector<Bullet*> bullets
を繰り返しています。敵との衝突を探しています。それは、次の場合を除いて、すべての場合において優れています。最後に発射された弾丸(複数の弾丸が存在しなければならない)が敵と衝突する場合。最後のstd :: vector要素を消去しようとすると、プログラムがクラッシュする
コード -
for(std::vector<Bullet*>::iterator it = bullets.begin(); it != bullets.end(); ++it)
{
if ((*it)->getSprite()->getGlobalBounds().intersects(enemy->getSprite()->getGlobalBounds()))
{
delete *it;
bullets.erase(it);
enemy->destroy();
if (bullets.size() == 0)
break;
}
}
私はfor
ループ内の特定の要素をコメントし、そしてbullet.erase(it)
呼び出しがプログラムをクラッシュしていることが分かりました。 クラッシュが発生すると、戻りコード:134(0x86)が返されます。そのコードの問題は何ですか?
(*it)->getSprite()
は、Bullet
クラスからスプライトへのポインタを返します。ご検討
auto is_hit = [&enemy](Bullet *bullet)
{
if (bullet->getSprite()->getGlobalBounds().intersects(enemy->getSprite()->getGlobalBounds()))
{
delete bullet;
enemy->destroy();
return true;
}
return false;
};
bullets.erase(std::remove_if(bullets.begin(), bullets.end(), is_hit), bullets.end());
['std :: vector :: erase'](http://en.cppreference.com/w/cpp/container/vector/erase)は、イテレータを無効にし、' ++ it'を呼び出した後に'erase'、未定義の動作です。 –
どうして 'std :: vector :: pop_back()' –
私は次のようなことを試みました:if(std :: next(it))== bullets.end() bullet.pop_back(); else bullets.erase(it); しかし、どちらもうまくいかないようです。 –