Frage zu std::map.erase
-
So ein Mist, da wollte ich das ganze schön simpel halten und dann passiert mir so etwas.
Na hier der Code
if(p.second->GetTelegram() == "TEST") { m_administrator = p.second; m_clientSocketMap.erase(p.first); }
Ergebnis:
**
/* do the allocation
*/
pvBlk = _heap_alloc_dbg(nSize, nBlockUse, szFileName, nLine);Unbehandelte Ausnahme bei 0x77e9bbf3 in winsock.exe: Microsoft C++ exception: std::bad_alloc @ 0x008fec58.**
-
versuch es mal so:
p = m_stringObjectMap.erase(p);
wobei p der iterator ist...
jedoch bekomm ich eine exception out of range, wenn der iterator auf das letzte element zeigt...weiß jemand warum?
cu
-
aja .end(); is ja das 0 element....
0 begin ......... n end
rend n ......... rbegin 0also lieber rbegin nehmen;-)
cu
-
Raff' ich nicht, dass lässt sich dann nichtmal compilieren.
Ich erkläre es noch einmal:Es gibt eine Liste map<string, Socket*> m_clientSocketMap.
Es werden IP's und Pointer auf die dazugehörigen Objekte gespeichert, Beispiel:clientSocketMap[192.168.133.142]->GetFQDN(); // Liefert den Fully qualified domain name
Irgendwann wird von einem dieser Sockets ein Telegramm kommen (in diesem Falle "Test", ist alles noch provisorisch), was ihn als Administrator identifiziert:
if(p.second->GetTelegram() == "TEST") // Wenn es das Admintelegramm ist dann { m_administrator = p.second; // setze den administrator zeiger auf den Socket m_clientSocketMap.erase(p.first); // und lösche den Eintrag dieser IP aus der clientSocketMap }
Beim löschen schmiert das Ding mit obig genannter Meldung ab.
Ist das denn auf den ersten Blick so richtig
-
p = p.second
Nochmal, solange du uns nicht sagst was p ist, kann dir niemand deine Frage beantworten.
-
Was denn? Ich hab euch jetzt 2x mal den "wirklichen" Code gegeben, hier jetzt ein drittes mal:
Es gibt eine Liste map<string, Socket*> m_clientSocketMap.
Es werden IP's und Pointer auf die dazugehörigen Objekte gespeichert, Beispiel:clientSocketMap[192.168.133.142]->GetFQDN(); // Liefert den Fully qualified domain name if(p.second->GetTelegram() == "TEST") // Wenn es das Admintelegramm ist dann { m_administrator = p.second; // setze den administrator zeiger vom Typ Socket* auf das Socketobjekt von p.second m_clientSocketMap.erase(p.first); // und lösche den Eintrag dieser IP aus der clientSocketMap }
-
HuiAbsturz schrieb:
Es gibt eine Liste map<string, Socket*> m_clientSocketMap.
clientSocketMap[192.168.133.142]->GetFQDN(); // Liefert den Fully qualified domain name
Das ist aber kein String, den du da als Key benutzt.
Wie füllst du die Map?
-
Ich geb nie wieder Beispiele *in den tisch beiss*
Natürlich heißt es wie folgt:clientSocketMap["192.168.133.142"]->GetFQDN(); // Liefert den Fully qualified domain name
Füllen tu ich die Map so:
void Server::AcceptConnection() { Socket *socket = new Socket(m_acceptSocket->Sock()); map<string, Socket*>::iterator result = m_clientSocketMap.find(socket->GetIP()); if(result == m_clientSocketMap.end()) m_clientSocketMap.insert(pair<string, Socket*>(socket->GetIP(), socket)); else delete socket; FD_CLR(m_acceptSocket->Sock(), &m_clientList); }
-
Ich hoffe ich lieg nicht zu falsch
clientSocketMap[192.168.133.142]->GetFQDN(); // v Gesucht wird: v map<string, Socket*>::iterator p; // nehme ich mal an...oder? // ^ gefunden? ^ p=clientSocketMap.begin(); // dann müste er so gefüllt werden (vielleicht in einer schleife?) if(p.second->GetTelegram() == "TEST") { m_administrator = p.second; m_clientSocketMap.erase(p); // p löschen (und nicht nur p.first) }
-
map<string, Socket*>::iterator p; // nehme ich mal an...oder?
Guter Gedanke aber ich habe es so gemacht:
for(map<string, Socket*>::iterator begin = m_clientSocketMap.begin(); begin != m_clientSocketMap.end();) { pair<string, Socket*> p = *begin; [...]
Das sollte erase aber egal sein, da erase entweder einen iterator nimmt, in diesem falle wäre es begin, oder aber den Key des zu löschenden Eintrags.
Bei beiden Varianten kommt es zum Absturz.
/* do the allocation */ pvBlk = _heap_alloc_dbg(nSize, nBlockUse, szFileName, nLine); winsock.exe: Microsoft C++ exception: std::bad_alloc @ 0x008fec4c.