vector iterators incompatible
-
Ich bekomme den oben genannten fehler bei einem Server-Programm bei diesem code:
bool TimersQueue::remove(Timer* timer) { vector<Timer*>::iterator iter = find(c.begin(), c.end(), timer); if(iter != c.end()) { vector <Timer*> timers; while(top() != timer) { timers.push_back(top()); pop(); } pop(); while(!timers.empty()) { push(timers.back()); timers.pop_back(); } return true; } return false; }ich hab schon nach lösungen gesucht aber bin mir nicht so ganz sicher wie ich das beheben kann.
Ich nehme an if(iter != c.end()) { ist das problem.
Ich hab irgendwo gelesen das .pushback die iteratoren invalidiert.
Wie kann ich das jetzt richtig machen?
-
Ja, den Fehler bekommt man normalerweise wenn man Iteratoren vergleicht, die von verschiedenen vectoren stammen oder auch wenn man Iteratoren von einem vector stammen, aber zwischendurch ungültig geworden sind. Und ja: push_back kann Iteratoren ungültig werden lassen.
Bei dir findet zwischen der Initialisierung von iter und dem Vergleich nichts statt was den Iterator ungültig werden lassen könnte. Bist du ganz sicher, dass der Fehler dort auftritt? Arbeitet dein Programm zufällig mit mehreren Threads?
-
Ja tut es und es passiert auch ganz sicher da.
Aber komischerweise nicht immer wenn die funktion aufgerufen wird, nur manchmal.

-
Buya23 schrieb:
Ja tut es und es passiert auch ganz sicher da.
Aber komischerweise nicht immer wenn die funktion aufgerufen wird, nur manchmal.

Es arbeitet mit mehreren Threads? Ich vermute, dass dort das Problem liegt. Ein anderer Thread macht irgendwas mit dem vector, dass die Iteratoren ungültig werden lässt.
-
was hat es eigentlich mit "Critical section" auf sich?
kann es damit was zu tun haben?
-
Buya23 schrieb:
was hat es eigentlich mit "Critical section" auf sich?
kann es damit was zu tun haben?Und wie! Der Begriff critical section drückt gerade aus, dass es etwas damit zu tun hat. Aber vielleicht solltest du dich erstmal mit diesen Grundlagen der Threadprogrammierung beschäftigen, dann dürfte dir alles klar werden.
-
Ja. Wenn zwischen Zeile (2) und (3) ein anderer Thread den
vectorverändert, dann kann es zu so einem Problem kommen.Aber das Thema ist sehr ausgiebig und du solltest dich da lieber gründlich einarbeiten, weil es sehr viele andere Probleme zu beachten gibt.