复杂的逻辑的BUG

在一个界面中的按钮事件中需要向 所有在线的服务器 发送信息

void Dialog::Button_Click()
{

    map <unsigned long, CServer*>::iterator iter;
    for ( iter = m_OnLineServers.begin(); iter != m_OnLineServers.end(); iter++ )
    {
         iter->second->sendMsg();
    }

}

所有 在线服务器 都存放在  m_OnLineServers  这个列表中,这个列表是一个 std::map
sendMsg()   内部又调用了 SOCKET 函数的 send

当 send 执行失败时,  会通知 Dialog 的  OnServerClose() 事件
void Dialog::OnServerClose(int nIndex)
{
  map <unsigned long, CServer*>::iterator iter   = m_OffLineServers.find(nIndex);
  if ( iter != m_OffLineServers.end() )
  {
   m_OffLineServers.insert(make_pair<unsigned long, CServer*>(nIndex, iter_find->second));
   m_OnLineServers.erase(nIndex);
  }


OnServerClose() 事件需要把 CServer 从 Online 列表中删除, 跟着添加到 OffLine 列表


结合起来看,就会出现在同一条线程中

遍历 map
{
    删除 map 元素
}

google了一下,网友们在遍历的过程中删除元素的方法是
for(iter = list.begin(); iter != list.end();)
{
    if (shouldDelete(*iter))
       iter = list.erase(iter);
    else
       ++iter;
}


似乎能解决问题,

但从上面的逻辑来看, 遍历跟删除, 分别是在两个不同的类, 这样一来逻辑就复杂多了
通常BUG都是因为复杂的逻辑而产生的。

你可能感兴趣的:(复杂的逻辑的BUG)