今天完成一个会话框架模块后,编译运行,某个会话生命周期结束后,就会出现这个错误提示:map/set iterator not dereferencable
看这个提示的意思大概是STL的迭代器不可引用,可能是越界了。仔细核查了下代码,果不其然:
//遍历会话表;
SessionTableIter iter = m_sessionTable.begin();
for (;iter != m_sessionTable.end();)
{
//判断指针是否为空;
if (NULL == iter->second)
{
std::string strSessionId = iter->first;
RemoveAssistMappingBySessionID(strSessionId);
m_sessionTable.erase( iter++ );
continue;
}
//会话是否关闭;
if (iter->second->isClosed())
{
delete iter->second;
iter->second = NULL;
m_sessionTable.erase( iter++ ); //这里已经将该节点删除;
std::string strSessionId = iter->first;
RemoveAssistMappingBySessionID(strSessionId);//而这里又企图对该节点的值进行使用,整个业务就乱了。当该节点正好是最后一个节点的时候就会越界,报错。
}/* 以下代码略 */
虽然是个很低级的逻辑顺序错误,但是还是mark下吧~