在空地图上调用清除时崩溃

时间:2011-09-25 04:35:29

标签: c++ visual-studio-2010 map

当我尝试与这个特定类中的地图进行交互时,我遇到了一个奇怪的崩溃。当我尝试在地图上调用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);
    }
}

更奇怪的是,这不是地图所特有的,而是这个特定类中的任何地图。我有另一张地图,直到这里才被触摸(我在此功能中通过明确的调用对其进行了测试)。

当我在地图上使用智能时,它们都会显示已经存在的大量值,而empty()调用返回false。类似地,size()返回非零结果。

的信息: 我正在Visual Studio 2010中编译并链接到SDL。

任何帮助都表示赞赏。

修改(更多信息):

我的标题有这一行:

private: std::map spriteMap_;

唯一被击中的代码就是我向你展示的功能。我有其他代码,但函数的断点从未被命中(我不称之为该函数)。

但这是:

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

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

固定

故事的道德是不要做这样的事情:

ObjPtr* objPtr = &Obj();

1 个答案:

答案 0 :(得分:1)

你可能正在破坏该类中某个地图的内存。获取地图内存地址,看看将断点附加到这些位置时会发生什么。

修改

  

Sprite * newSprite =& Sprite(nextSpriteId_,this,image);

这里是一个指向临时对象的指针;请注意,这甚至不是合法的C ++,而是令人讨厌的MSVC语言扩展。在您指向它之后,临时Sprite对象被销毁,并且您将留下无效指针。然后你引用指向获取id的指针 - 这里只是偶然地工作 - 然后将无效指针添加到地图。至少有一个问题,它可能与你的崩溃有关,也可能没有,可能会有更多的问题。