当我尝试与这个特定类中的地图进行交互时,我遇到了一个奇怪的崩溃。当我尝试在地图上调用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();
答案 0 :(得分:1)
你可能正在破坏该类中某个地图的内存。获取地图内存地址,看看将断点附加到这些位置时会发生什么。
修改强>
Sprite * newSprite =& Sprite(nextSpriteId_,this,image);
这里是一个指向临时对象的指针;请注意,这甚至不是合法的C ++,而是令人讨厌的MSVC语言扩展。在您指向它之后,临时Sprite
对象被销毁,并且您将留下无效指针。然后你引用指向获取id的指针 - 这里只是偶然地工作 - 然后将无效指针添加到地图。至少有一个问题,它可能与你的崩溃有关,也可能没有,可能会有更多的问题。