我的代码有问题。我已经创建了一个地图来存储弹丸和弹丸的ID。当玩家射击时,它会在地图上创建一个新的投射物。当弹丸离开屏幕时,将其删除,我正在使用迭代器删除指向弹丸的指针,并擦除了两个元素(弹丸的ID和指向弹丸的指针)。我可以完美地运行该程序,但是当我拍摄时(这会调用该函数并创建一个新的弹丸...当迭代时,该应用程序崩溃并显示以下错误:

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


谢谢您的帮助。

最佳答案

请注意,错误显示为“映射/设置擦除迭代器超出范围”。调用erase时实际上崩溃了。

问题是您已经破坏了Projectile对象。然后,您尝试执行p->getProjectileNum()传递给find。您将需要更早地存储p->getProjectileNum()的结果,然后使用它来查找要擦除的地图的适当元素。

旁注:如果您已经有指向Projectile的指针,为什么都要遍历地图以找到它?您可以执行delete p;。我假设每个Projectile的弹丸编号都是唯一的。如果是这种情况,您可以先执行erase然后执行delete p;

关于c++ - 遍历 map 会使应用程序崩溃,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/20787771/

10-12 03:20