我刚刚开始尝试使用矢量,并且在删除矢量中的某个点时我一直遇到这个问题。一旦执行erase()函数,它就会导致应用程序崩溃并发生内存访问冲突。
以下是该函数的代码:
bool moveBullets(void)
{
int i = 0;
for(std::vector<sf::Sprite>::iterator it = laserList.begin(); it != laserList.end(); it++)
{
laserList[i].move(0.0f, -2.0f);
int id = 0;
for(std::vector<sf::Sprite>::iterator s = enemy.begin(); s != enemy.end(); s++)
{
if(checkCollision(laserList[i], enemy[id]))
{
laserList.erase(laserList.begin() + i);
//enemy.erase(s);
std::cout << "COLLISION";
}
id++;
}
i++;
}
return 0;
}
这个函数基本上是通过向量运行并检查另一个向量进行冲突。因此,向量A将一直检查通过向量B的碰撞。一旦它完全检查了向量B,它将进入向量A中的下一个位置并重复。
然而,它运行erase()函数之前一切正常。然后它会导致内存访问错误。
感谢您的帮助! : - )
答案 0 :(得分:1)
当您致电erase
时,您需要修改laserList
。这使it
无效,因为它指向laserList
的先前值。但随后你增加it
。您不能将迭代器增加到不再存在的内容。这毫无意义。