试图从向量中删除特殊对象并失败

时间:2019-01-09 14:25:04

标签: c++ vector

我有一个包含对象的向量,并且我想删除一些特殊的对象,并且我的程序在我的“ delete(* iter)”行中崩溃,并显示消息“ Process完成退出代码0”,并且我没有任何内容知道为什么

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 :(得分:3)

players.erase(iter)操作使iter无效。迭代之后,将执行++iter,在下一次迭代*iter中,由于迭代器无效,两者都具有未定义的行为。

您必须使用以下算法:

  • 如果擦除了迭代器,则erase将迭代器返回到下一个元素。
  • 否则,增加迭代器。