Итерация по карте приводит к сбою приложения

0

У меня проблемы с моим кодом. Я создал карту для хранения снарядов и идентификаторов снарядов. Когда игрок стреляет, на карте создается новый снаряд. Когда снаряд выходит из экрана, он удаляется, и я использую итераторы, чтобы удалить указатель к снаряду, и он удаляет два элемента (идентификатор снаряда и указатель на снаряд). Я могу запустить программу отлично, но когда я снимаю (который вызывает функцию и создает новый снаряд... Когда он итерации, приложение выходит из строя с ошибкой:

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;
}

Спасибо за помощь.

Теги:
for-loop
iterator
map

1 ответ

3
Лучший ответ

Обратите внимание, что ошибка говорит "map/set erase iterator out range". Это на самом деле сбой при вызове erase.

Проблема в том, что вы уже уничтожили объект Projectile. Затем вы пытаетесь выполнить p->getProjectileNum() чтобы перейти к find. Вам нужно будет сохранить результат p->getProjectileNum() раньше, а затем использовать его, чтобы найти соответствующий элемент карты для стирания.

Замечание: если у вас уже есть указатель на " Projectile, почему итерация через карту, чтобы найти ее? Вы можете просто delete p; , Я предполагаю, что номер снаряда уникален для каждого Projectile. И если это так, вы можете просто erase а затем delete p; ,

Ещё вопросы

Сообщество Overcoder
Наверх
Меню