イテレータがよくわからない挙動を示しましたので、その質問です。
本来であればソースコードを示すべきとは思いますが、再現方法が自分でもわからないため、再現方法の取っ掛かりをつかめればと思い質問しました。
抽象的な話になると思いますが、よろしくお願い申し上げます。
void BulletManage::update(){
for(vector<BulletBase*>::iterator it=this->bullet.begin();it!=this->bullet.end();){
if((*it)->getValidate()==false){
delete *it;
it = this->bullet.erase(it);
continue;
}
(*it)->update();
++it;
}
}
bulletは、弾幕STGにおける弾クラスです。
しばらくは思った通りに弾が動きます。しかし、あるとき突然、"Vector Iterator not incrementable"というエラーが発生します。
止まった時の様子をデバッガで確かめたところ、itがNULLとなっていました。
なぜNULLになるのか...
とりあえず、[NULLならbreak]の条件文を入れて対応していますが、どうにも納得いきません。
このエラーは最初から出ていたわけではなく、これまでにも複数弾幕データを作ってきて、すべて問題なく動いてきました。
(今まで運が良かっただけ、ということはないと思いたいですが...)
新しく作った弾幕でのみ発生するエラーです。
この新しい弾幕データは何が違うのかが問題ですが、
新しく作ったものは、bulletがbulletを自己生成する、といえばいいのでしょうか。
bulletが、update()関数内でbulletをnewしてpush_backします。
それ問題なのかわかりませんが、これくらいしか僕の中では思い当たる節がありません...
実は、イテレータを使ってvectorにアクセスするときに、push_backしてはいけない、というルールがあるのでしょうか。
弾幕を作る際に、bulletの初期条件を与える必要があるのですが、このときの加速度を0.01から0.012にしたり、同時に発生する数を15から10にしたらエラーが発生しなくなった、
などが起こったため、別のところに原因がある気がしますが...
(それとも運よくエラーが発生しなかっただけ?)
抽象的で情報不足な質問で申し訳ありません。
上記の使い方に問題がないようでしたら、問題ないと教えていただけるだけでも幸いです。
よろしくお願いします。