Was passiert mit einem STL iterator ist nach dem löschen ist es im VS, UNIX/Linux?
Bitte betrachten Sie das folgende Szenario:
map(T,S*) & GetMap(); //Forward decleration
map(T, S*) T2pS = GetMap();
for(map(T, S*)::iterator it = T2pS.begin(); it != T2pS.end(); ++it)
{
if(it->second != NULL)
{
delete it->second;
it->second = NULL;
}
T2pS.erase(it);
//In VS2005, after the erase, we will crash on the ++it of the for loop.
//In UNIX, Linux, this doesn't crash.
}//for
Es scheint mir, dass in VS2005, nach dem "erase", der iterator wird gleich zu Ende(), daher der Absturz beim Versuch zu erhöhen es.
Gibt es wirklich Unterschiede zwischen Compilern in das Verhalten hier vorgestellt?
Wenn ja, was wird der iterator nach dem "löschen" gleich in UNIX/Linux?
Dank...
- Fragte und antwortete: stackoverflow.com/questions/263945/...
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ja, wenn Sie erase einen iterator, iterator bekommt eine so genannte singular value, was bedeutet, es gehört nicht zu jedem container mehr. Sie können nicht, Inkrement, Dekrement-oder Auslesen/schreiben um es nicht mehr. Die richtige Art und Weise zu tun, die Schleife ist:
Für Container, die ungültig werden könnten, andere Iteratoren beim löschen eines iterator
erase
gibt den nächsten gültigen iterator. Dann tun Sie es mitSo funktioniert es für
std::vector
undstd::deque
, aber nicht fürstd::map
oderstd::set
.Nach Aufruf
erase
auf einen iterator in einestd::map
ist es ungültig. Dies bedeutet, dass Sie es nicht verwenden können. Der Versuch, es zu benutzen (z.B. durch das Inkrementieren es) ist ungültig und kann dazu führen, alles, was geschieht (einschließlich einem crash). Für einestd::map
Aufruferase
auf einen iterator, nicht das erlöschen aller anderen iterator, so dass (zum Beispiel) nach diesem Aufruf, (so lange, wieit
war nichtT2pS.end()
), so gilt:Natürlich, wenn Sie diesen Ansatz verwenden, möchten Sie nicht unbedingt Inkrement
it
in der for-Schleife.Für dieses Beispiel, obwohl, warum sich die Mühe machen zu löschen, die in der for-Schleife? Warum nicht einfach anrufen T2pS.clear() am Ende der Schleife.
On die andere hand, es sieht aus wie Sie ein raw-pointer 'rechts' von der Karte, aber die Karte scheint selbst die Spitzen zu widersprechen. In diesem Fall, warum nicht die Sache auf die Rechte Seite der Karte eine Art intelligente Zeiger, wie std::tr1::shared_ptr?
[Übrigens, ich sehe keine template-Parameter zu
map
. Haben Sie typedef ' ed spezifische Instanziierungstd::map
alsmap
im lokalen namespace?]Dies sehen:
Ich denke, wenn Sie ändern die Kollektion, die Sie ungültig machen Sie Ihre iterator. Sie können nicht Sie verlassen sich auf das Verhalten, als du herausgefunden hast.