std::map Absturz bei .erase()



  • Hallo!

    Ich habe folgende Schleife, in der fettmarkierten Zeile stürzt das Programm mit einer unbehandelten Ausnahme ab:

    [cpp]
    for(map<string, Socket*>::iterator begin = m_clientSocketMap.begin(); begin != m_clientSocketMap.end(); ++begin)
    {
    pair<string, Socket*> p = *begin;

    [...]
    delete p.second;
    m_clientSocketMap.erase(begin); // Absturz
    [...]
    }
    [/cpp]

    Der Fehler soll in dieser Datei an folgender Stelle liegen:

    **
    iosfwd:
    static void __cdecl assign(_Elem& _Left, const _Elem& _Right)
    { // assign an element
    _Left = _Right;
    }
    **

    Aber das bringt mich nicht weiter 😕 ? Auch wenn ich statt des Iterators den Key angebe stürzt es an der selben Stelle ab ⚠


  • Mod

    begin ist nach dem erase ungültig. das ++begin in der schleife (und auch alles, was im nächsten schleifendurchgang passiert) also undefiniert. es müsste also schon

    for(map<string, Socket*>::iterator begin = m_clientSocketMap.begin(); begin != m_clientSocketMap.end(); )
        {
            pair<string, Socket*> p = *begin;
    
            [...]
            delete p.second;
            m_clientSocketMap.erase(begin++);  // Absturz
            [...]
        }
    

    sein.


Anmelden zum Antworten