【发布时间】:2013-01-28 13:24:11
【问题描述】:
我一直在努力解决一个相当令人费解的问题:当我的实体管理器在更新循环中遍历实体映射时,我偶尔会遇到分段错误。奇怪的是,这种情况并非一直发生。有时它会在加载时崩溃,有时我可以在出现段错误之前在应用程序状态(以及多次加载和卸载实体)之间切换几次。在调试模式下,我似乎也遇到了更多的段错误。我的实体由指向 Behavior 和 Drawable 类的指针组成。
段错误后我的调用堆栈:
#0 6FCB4986 libstdc++-6!_ZSt18_Rb_tree_incrementPSt18_Rb_tree_node_base() (C:\MinGW\bin\libstdc++-6.dll:??)
#1 0040A1D7 std::_Rb_tree_iterator<std::pair<unsigned int const, Entity*> >::operator++(this=0x28fe94) (c:/mingw/bin/../lib/gcc/mingw32/4.6.2/include/c++/bits/stl_tree.h:196)
#2 00401F55 EntityManager::onLoop(this=0x417238) (C:\Users\Nelarius\Documents\Kurssit\Miinaharava\src\engine\EntityManager.cpp:75)
#3 00401640 App::onLoop(this=0x417040) (C:\Users\Nelarius\Documents\Kurssit\Miinaharava\src\engine\App.cpp:38)
#4 0040160C App::execute(this=0x417040) (C:\Users\Nelarius\Documents\Kurssit\Miinaharava\src\engine\App.cpp:30)
#5 00403BD7 main(argc=1, argv=0x642908) (C:\Users\Nelarius\Documents\Kurssit\Miinaharava\src\main.cpp:15)
这是我的更新循环:
void EntityManager::onLoop()
{
std::map<const unsigned int, Entity*>::iterator it;
for (it = _gameObjects.begin(); it != _gameObjects.end(); it++)
{
Behavior* behavior = it->second->getBehavior();
if (behavior)
{
behavior->update();
}
}
}
我得到了段错误
for (it = _gameObjects.begin(); it != _gameObjects.end(); it++)
顺便问一下,当我不使用任何多线程时,有两个线程是正常的吗?我正在查看Code::Blocks 调试窗口,碰巧看到线程监视窗口中有两个线程(不过只有一个处于活动状态)。
【问题讨论】:
-
欢迎光临车祸现场。
-
你在地图中有一对Entity(即it->second)实际上是NULL吗?但是,这听起来像是内存损坏。但是您需要告诉我们更多信息。
-
@MariusBancila:不一定是 NULL,这很容易检测到。悬空会更糟。他正在使用原始指针,因此指针可能不是 NULL,而是指向已销毁的对象。取消引用这样的指针是未定义的行为。这就是应该使用智能指针的原因。
-
我向你保证这不是“随机的”。
-
我希望我的实体管理器类不能引用悬空指针。我刚刚添加了一个检查它->second == NULL,但它似乎没有捕获任何东西,而且我仍然在
for (it = _gameObjects.begin(); it != _gameObjects.end(); it++)遇到段错误
标签: c++ map iterator segmentation-fault