У меня проблемы с моим кодом. Я создал карту для хранения снарядов и идентификаторов снарядов. Когда игрок стреляет, на карте создается новый снаряд. Когда снаряд выходит из экрана, он удаляется, и я использую итераторы, чтобы удалить указатель к снаряду, и он удаляет два элемента (идентификатор снаряда и указатель на снаряд). Я могу запустить программу отлично, но когда я снимаю (который вызывает функцию и создает новый снаряд... Когда он итерации, приложение выходит из строя с ошибкой:
Expression: map/set erase iterator outside range
Я создал typedef для карты:
typedef std::map<int, class Projectile*> ProjMap;
Вот код:
void Player::destroyProjectile(Projectile *p)
{
std::cout << "Deleting projectile with ID "<< p->getProjectileNum() << std::endl;
//Iterating through the map
for (ProjMap::iterator it = projectiles.begin(); it != projectiles.end(); it++)//It crashes here
{
if (it->first == p->getProjectileNum()){
delete it->second;
}
else
continue;
}
//Deleteing the two elements
projectiles.erase(projectiles.find(p->getProjectileNum()));
std::cout << "Projectiles size: " << projectiles.size() << std::endl;
}
Спасибо за помощь.
Обратите внимание, что ошибка говорит "map/set erase iterator out range". Это на самом деле сбой при вызове erase
.
Проблема в том, что вы уже уничтожили объект Projectile
. Затем вы пытаетесь выполнить p->getProjectileNum()
чтобы перейти к find
. Вам нужно будет сохранить результат p->getProjectileNum()
раньше, а затем использовать его, чтобы найти соответствующий элемент карты для стирания.
Замечание: если у вас уже есть указатель на " Projectile
, почему итерация через карту, чтобы найти ее? Вы можете просто delete p;
, Я предполагаю, что номер снаряда уникален для каждого Projectile
. И если это так, вы можете просто erase
а затем delete p;
,