因此,我正在尝试创建一种保存/跳转系统,玩家可以在其中将世界的某些方面还原到先前的位置。由于某种原因,以下代码会产生矢量错误。 (“向量下标超出范围”)
(entityList是一个ptr,而recordedEntityList不是)
void Map::record()
{
for(unsigned int x = 0; x < entityList.size(); x++)
{
if(entityList[x]->getRewind() == true)
{
recordedEntityList.push_back(*entityList[x]);
printf("%f, %f\n", entityList[x]->getSprite().getPosition().x, entityList[x]->getSprite().getPosition().y);
}
}
}
void Map::rewind()
{
for(unsigned int x = 0; x < entityList.size(); x++)
{
if(entityList[x]->getRewind() == true)
{
entityList.erase(entityList.begin() + x);
}
}
for(unsigned int y = 0; y < recordedEntityList.size(); y++)
{
entityList.push_back(&recordedEntityList[y]);
}
recordedEntityList.clear();
}
最佳答案
在rewind
中,您将指向recordedEntityList
元素的指针推入entityList
,然后清除recordedEntityList
。这将导致entityList
包含无效的指针,并在访问指针时调用未定义的行为。
另外,与该错误无关,在rewind
的第一个循环中迭代时修改向量的方式可能会导致您跳过条目:如果两个连续的条目使getRewind()
返回true
,则赢得第二个不会被删除。