因此,我正在尝试创建一种保存/跳转系统,玩家可以在其中将世界的某些方面还原到先前的位置。由于某种原因,以下代码会产生矢量错误。 (“向量下标超出范围”)

(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,则赢得第二个不会被删除。

09-06 21:52