通过地图迭代会导致应用崩溃

时间:2013-12-26 16:15:47

标签: c++ for-loop map iterator

我的代码遇到问题。我已经创建了一个地图来存储射弹和射弹的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;
}

感谢您的帮助。

1 个答案:

答案 0 :(得分:3)

请注意,错误显示“map / set erase iterator outside range”。它实际上是在调用erase时崩溃的。

问题是你已经销毁了Projectile对象。然后,您尝试p->getProjectileNum()传递给find。您需要先存储p->getProjectileNum()的结果,然后使用它来查找要删除的地图的相应元素。

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