2013-11-30 3 views
0

Итак, я пытаюсь создать своего рода систему сохранения/перехода, в которой игрок может вернуть определенные аспекты мира к предыдущей точке. По какой-то причине следующий код создает векторные ошибки. ("Вектор индекс выходит за пределы диапазона")Проблемы с векторным диапазоном

(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(); 
} 
+2

Вы не можете изменить вектор (или любой контейнер), который вы выполняете, не испортив вещи. Вы можете заглянуть в [Erase-Remove Idiom] (http://en.wikipedia.org/wiki/Erase-remove_idiom). –

+2

И BTW, видя 'if (condition == true)' всегда заставляет меня плакать. Просто используйте 'if (condition)'. –

+0

Возможно, вы захотите прокомментировать, если вы измените свой вопрос, сделав мой ответ устаревшим ... – interjay

ответ

2

В rewind, Вы выдвигаете указатели на элементы recordedEntityList в entityList, а затем вы ясно recordedEntityList. Это приведет к тому, что entityList будет содержать недействительные указатели и вызовет неопределенное поведение при доступе к указателям.

Кроме того, не связанные с этой ошибкой, то, как вы изменить вектор во время прохода над ним в первом цикле в rewind может причинить вам пропустить записи: Если два последовательных записей имеют getRewind() возвращение true, второй не будет удалить.

Смежные вопросы