Wszystko przez to, że funkcja składowa std::vector::erase psuje iterator, który otrzymała jako argument, oraz wszystkie inne za nim. To powinno pomóc:
for(auto itr = pocisk.begin(); itr != pocisk.end(); ++itr){ //zywotnosc pociskow if(itr->still_alive()==TRUE) { auto prev = itr - 1; pocisk.erase(itr); itr = prev; } }