Сбой при чистом вызове на пустой карте - PullRequest
1 голос
/ 25 сентября 2011

Я получаю странный сбой, когда пытаюсь взаимодействовать с картой в этом конкретном классе.Когда я пытаюсь вызвать clear () или даже begin () на карте, происходит сбой.Я ничего не добавил к карте, на данный момент ничего не коснулось.

Код, о котором идет речь:

spriteMap_.clear();
if (!spriteMap_.empty())
{
    SpriteMap::const_iterator end = spriteMap_.end();
    for (SpriteMap::const_iterator it = spriteMap_.begin(); it != end; ++it)
    {
        it->second->draw(screen);
    }
}

Даже странно, что это не уникально для карты, нона любые карты в этом конкретном классе.У меня есть другая карта, которая также не затрагивается до этого момента (я проверил ее с явным вызовом в этой функции).

Когда я использую intelli-sense на картах, оба показывают себя с тоннами значений уже вих и вызов empty () возвращает false.Аналогично, size () возвращает ненулевой результат.

Информация: я компилирую в Visual Studios 2010 и создаю ссылки на SDL.

Любая помощь приветствуется.

Изменить (подробнее):

В моем заголовке есть эта строка:

private: std::map spriteMap_;

И единственный код, который ударил - это функция Iпоказал тебе.У меня есть другой код, но точка останова для функции никогда не срабатывает (я не вызываю эту функцию).

Но вот она:

Sprite* SpriteManager::createSprite(std::string fileName)
{
   ...

   Sprite* newSprite = &Sprite(nextSpriteId_, this, image);
   nextSpriteId_++;
   spriteMap_[newSprite->id_] = newSprite;
   return newSprite;
}

Исправлено:

Мораль этой истории такова: никогда не делай что-то вроде этого:

ObjPtr* objPtr = &Obj();

1 Ответ

1 голос
/ 25 сентября 2011

Возможно, вы повреждаете память карты где-то в этом классе.Получите адрес памяти карты и посмотрите, что произойдет, когда вы прикрепите точки останова к таким местоположениям.

Изменить:

Sprite * newSprite = & Sprite (nextSpriteId_, this, изображение);

Здесь вы берете указатель на временный объект;обратите внимание, что это даже не легальный C ++, а противное расширение языка MSVC.Сразу после того, как вы возьмете указатель на него, временный объект Sprite будет уничтожен, и у вас останется недопустимый указатель.Затем вы ссылаетесь на этот указатель, чтобы получить идентификатор, который работает здесь случайно, и затем добавляете этот недействительный указатель на карту.Это, по крайней мере, одна из проблем, это может или не может быть связано с вашей аварией, там может быть больше проблем.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...