C++遍历中删除std::hash_map元素问题


问题:在遍历中删除std::hash_map元素时,出现服务器挂的情况。  

改进前代码:    

//释放指定会议的socket和客户信息
    it=m_ClientSocket.begin();
    for(;it!=m_ClientSocket.end();it++)
    {
        if (it->second.meetingid==loginuserinfo.meetingid)
        {
            SOCKET s=it->first;
            closesocket(s);
            cout<<"close socket is :"<<s<<endl;
            m_ClientSocket.erase(it);//问题就出现在这里不能返回下一个迭代器,因为已经删除it了,退出if后it就不知道从那里加起了
        }
   
    }
    return true;
}

解决方法:

     如改进代码:

       //释放指定会议的socket和客户信息
    it=m_ClientSocket.begin();
    for(;it!=m_ClientSocket.end();)
    {
        if (it->second.meetingid==loginuserinfo.meetingid)
        {
            SOCKET s=it->first;
            closesocket(s);
            cout<<"close socket is :"<<s<<endl;
            m_ClientSocket.erase(it++);//,因为这样的话就能保证在函数执行退出前使it在原来元素的位置的基础上指向下一个元素的位置,如退出后再加的话,原来的位置地址已经删除了,所以it就无从加起了
        }
        else
        {
           ++it;
        }
    }
    return true;
}


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM