пытается удалить специальный объект из вектора и потерпеть неудачу - PullRequest
0 голосов
/ 09 января 2019

У меня есть вектор, который содержит объект, и я хочу удалить какой-то особенный объект, и моя программа просто аварийно завершает работу с сообщением «Процесс завершен с кодом выхода 0» в моей строке «delete (* iter)», и у меня нет никакого идея почему

void killHero(Hero* hero,vector<Hero*>& players)
{
    std::vector<Hero*> ::iterator iter;
    int count = 0;
    for(iter=players.begin(); iter!=players.end();++iter) {
        Hero *h = *iter;
        if (h->getName() == hero->getName()) {
            delete *iter;
            players.erase(iter);
            vecorSize--;
        }
    }

}

мой вектор содержит:

  void createNewGame(vector<Hero*> &players,int warriors, int thieves, int necromancers)
{
    string nameOfwarrior="";
    for(int i=0; i<warriors; i++)
    {
        cout << "Please insert warrior number "<< i+1 << " name:"<<endl;
        std::getline(cin,nameOfwarrior);
        try
        {
            digitCheck(nameOfwarrior);
            Warrior *warr = new Warrior(nameOfwarrior);
            players.push_back(warr);
        }
        catch(GameException& e )
        {
            e.error();
            i--;
        }
    }
    for(int i=0; i<thieves; i++)
    {
        cout << "Please insert thief number "<< i+1 << " name:"<<endl;
        std::getline(cin,nameOfwarrior);
        try
        {
            digitCheck(nameOfwarrior);
            Thief* thief = new Thief(nameOfwarrior);
            players.push_back(thief);
        }
        catch(GameException& e)
        {
            e.error();
            i--;
        }
    }
    for(int i=0; i<necromancers; i++)
    {
        cout << "Please insert necromancer number "<< i+1 << " name:"<<endl;
        std::getline(cin,nameOfwarrior);
        try
        {
            digitCheck(nameOfwarrior);
            Necromancer* necro = new Necromancer(nameOfwarrior);
            players.push_back(necro);
        }
        catch(GameException& e)
        {
            e.error();
            i--;
        }
    }
}

что может решить проблему? спасибо

1 Ответ

0 голосов
/ 09 января 2019

players.erase(iter) операция делает недействительной iter. После итерации выполняется ++iter, а в следующей итерации *iter оба имеют неопределенное поведение, поскольку итератор недопустим.

Вы должны использовать следующий алгоритм:

  • Если итератор удален, то erase возвращает итератор к следующему элементу.
  • Иначе, увеличить итератор.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...