ベクターから要素を消去すると、反復子が無効になるため、後で反復を続けることはできません。この場合、ループ内の要素を消去しません。その後、ベクトルをクリアします。
for (auto it = gamestates_.begin(); it != gamestates_.end(); ++it){
delete *it;
}
gamestates_.clear();
ただし、これがデストラクタにあり、ベクトルが破棄されようとしている場合は、それをクリアしても意味がありません。
ループ内で消去する必要がある場合 (おそらく一部の要素のみを消去したいため)、反復子を有効に保つためにもう少し注意が必要です。
for (auto it = gamestates_.begin(); it != gamestates_.end();){ // No ++ here
if (should_erase(it)) {
it = gamestates_.erase(it);
} else {
++it;
}
}
まだ試していないことの 1 つは使用unique_ptrですが、これを使用しなくても処理できるはずです。私が間違っている場合は、私を修正してください。
これにより動的オブジェクトをストリームで管理したい場合は、必ず3 つのルールに従ってください。「浅い」コピーを防ぐために、コピー コンストラクターとコピー代入演算子を実装 (または削除) する必要があります。同じオブジェクトを削除しようとする 2 つのベクトル。また、オブジェクトを削除または置換する他の場所にあるオブジェクトを削除するように注意する必要があります。スマート ポインター (またはポリモーフィズムにポインターが必要ない場合はオブジェクト自体) を格納すると、これらすべての処理が行われるので、常にそれをお勧めします。
ループの後にベクトルをクリアする必要があることは承知していますが、これは、ポインターを削除する通常の方法をすべて試した結果です。削除コマンドが気に入らないようです。
最も可能性の高い原因は、3 つのルールに従っておらず、ベクトルをコピーした後に誤って同じオブジェクトを 2 回削除しようとしたことです。GameStateが基底クラスであり、それに仮想デストラクタを与えるのを忘れていたり、ポインタが他のコードによって破損している可能性もあります。