Запутанные векторные итераторы несовместимы с ошибкой времени выполнения

Итак, вот в чем дело. У меня есть класс контейнера,

#include "stdafx.h"
#include "ObjectManager.h"
#include "Game.h"

ObjectManager::ObjectManager()
{
}

ObjectManager::~ObjectManager()
{
   std::for_each(_objects.begin(),_objects.end(),ObjectDeallocator());
   std::for_each(_dynamicObjects.begin(),_dynamicObjects.end(),DynamicObjectDeallocator());
}


void ObjectManager::Add(std::string name, VisibleGameObject *object)
{
    _objects.insert(std::pair<std::string, VisibleGameObject*>(name,object));
}

void ObjectManager::Remove(std::string name)
{
    std::map<std::string, VisibleGameObject*>::iterator results = _objects.find(name);
    if (results != _objects.end())
    {
        delete results->second;
        _objects.erase(results);
    }
}

int ObjectManager::GetObjectCount() const
{
    return _objects.size();
}

VisibleGameObject* ObjectManager::Get(std::string name) const
{
    std::map<std::string, VisibleGameObject*>::const_iterator results = _objects.find(name);
    if (results == _objects.end())
        return NULL;
    return results->second;
}


void ObjectManager::AddDynamic(VisibleGameObject *object)
{
    _dynamicObjects.push_back(object);
}

void ObjectManager::PostRemoveDynamic()
{
        std::vector<VisibleGameObject*>::const_iterator iter = _dynamicObjects.begin();
    while(iter != _dynamicObjects.end())
    {
        if ((*iter)->IsDeleted())
        {
            delete (*iter);
            _dynamicObjects.erase(iter);
        }
    iter++;
    }
}

const std::vector<VisibleGameObject*>& ObjectManager::GetDynamicContainer()
{
    return _dynamicObjects;
}


void ObjectManager::DrawAll(sf::RenderWindow& renderWindow)
{
    std::map<std::string, VisibleGameObject*>::const_iterator itr = _objects.begin();
    while(itr != _objects.end())
    {
        itr->second->Draw(renderWindow);
        itr++;
    }

    std::vector<VisibleGameObject*>::const_iterator iter = _dynamicObjects.begin();
    while(iter != _dynamicObjects.end())
    {
        (*iter)->Draw(renderWindow);
        iter++;
    }
}

void ObjectManager::UpdateAll()
{
    std::map<std::string, VisibleGameObject*>::const_iterator itr = _objects.begin();
    std::vector<VisibleGameObject*>::iterator iter;
    iter = _dynamicObjects.begin();

    float timeDelta = GameEngine::GetWindow().GetFrameTime();

    while(itr != _objects.end())
    {
        itr->second->Update(timeDelta);
        itr++;
    }

    while(iter != _dynamicObjects.end())
    {
        (*iter)->Update(timeDelta);
        iter++;
    }

}

и, используя точки останова, я определил, что проблема в этой функции здесь,

void ObjectManager::UpdateAll()
{
    std::map<std::string, VisibleGameObject*>::const_iterator itr = _objects.begin();
    std::vector<VisibleGameObject*>::iterator iter;
    iter = _dynamicObjects.begin();

    float timeDelta = GameEngine::GetWindow().GetFrameTime();

    while(itr != _objects.end())
    {
        itr->second->Update(timeDelta);
        itr++;
    }

    while(iter != _dynamicObjects.end())
    {
        (*iter)->Update(timeDelta);
        iter++;
    }

}

В частности, эта строка,

    (*iter)->Update(timeDelta);

Мои поиски в Интернете не дали ответа, поэтому теперь я спрашиваю вас, в чем причина этого сбоя. Также я опубликую заголовок, если кому-то нужно его увидеть. Кроме того, это модифицированный класс из онлайн-учебника.

Изменить: сообщение об ошибке исходит от встроенного утверждения в классе векторов. (Выражение: векторные итераторы несовместимы)


person Randomone    schedule 17.02.2012    source источник
comment
Какое точное сообщение об ошибке вы получаете?   -  person Greg Hewgill    schedule 17.02.2012


Ответы (1)


Хорошо, немного поспав, я понял это. В качестве предупреждения для других, проблема возникла из-за того, что один из обновляемых объектов создал новый динамический объект после того, как итератор был определен, что сделало его недействительным. Я отредактирую это с помощью некоторого кода, объясняющего это, как только смогу добраться до компьютера.

person Randomone    schedule 17.02.2012