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