为什么std string ==崩溃?
问题描述:
当我运行我在调试模式下的应用,有时我得到一个运行时错误在此函数:为什么std string ==崩溃?
void ChatListHandler::seatOccupancyChanged(const std::string& userName, bool occupied, bool isSelf, bool isSelfTable, int tableNo, int seatNo, int numPlayersAtTable)
{
if(!isSelf && (isInGroup(userName,IN_GAME_GROUP) || isInGroup(userName,IN_LOBBY_GROUP)))
{
if(occupied)
{
movePlayer(userName,IN_GAME_GROUP);
}
else
{
movePlayer(userName,IN_LOBBY_GROUP);
}
}
}
bool ChatListHandler::isInGroup(const std::string& name, GroupTypeEnum group)
{
for(size_t i = 0; i < m_groups.size(); ++i)
{
if(m_groups[i].second == group)
{
if(m_groups[i].first->getList())
{
for(agui::ListItem::iterator it =
m_groups[i].first->getList()->getItemsBegin(); it !=
m_groups[i].first->getList()->getItemsEnd(); ++it)
{
if((*it).first.text == name)
{
return true;
}
}
}
break;
}
}
return false;
m_list->repositionGroups();
}
它崩溃上:
if((*it).first.text == name)
我得到:
Unhandled exception at 0x5fd1942c (msvcp90d.dll) in my.exe: 0xC0000005: Access violation reading location 0x00000040.
的调用堆栈看起来像:
个感谢
答
我不能肯定没有看到所有的代码,但我的猜测是,有错误必须做这些行:
for(agui::ListItem::iterator it =
m_groups[i].first->getList()->getItemsBegin(); it !=
m_groups[i].first->getList()->getItemsEnd(); ++it)
除非你到getList()
电话总是返回完全每次都有相同的列表(即指向同一列表的指针,而不是副本),您可能会在不同列表中获取迭代器。这意味着检查it != m_groups[i].first->getList()->getItemsEnd()
将始终是false
,因为迭代器来自不同的列表。在那种情况下,你的迭代器可能会走到列表的末尾,所以解引用会导致崩溃。
希望这会有所帮助!
发布一个真正的堆栈跟踪,请... –