我的代码有问题。我已经创建了一个地图来存储弹丸和弹丸的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/