ERLEDIGT
JA
JA
ANTWORTEN
1
1
ZUGRIFFE
738
738
EMPFEHLEN
-
Hallo liebes Forum,
ich hab da ein Problem mit der std::list::erase() Funktion.
Irgendwie habe ich das Gefühl, dass diese nicht ganz sauber funtioniert.
Laut definition soll ja erase() ein iterator auf das nächste Objekt liefern!
Es kommt nur bei langen Listen zu folgendem Fehler:
sowie:list iterator not dereferencable
Das kann aber nicht sein, da vorher darauf geprüft wird!Standard C++ Libraries Out of Range
Hier erstmal die Funktion, wo der fehler passiert:
Code :1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
void RoiDetector::updateObjectList( std::list<DetectedObject*>::iterator& iter, std::list<DetectedObject*>::iterator& findIter ) { DetectedObject* newObject = NULL; newObject = new DetectedObject( (*iter)->data, (*iter)->category, (*iter)->ratio ); newObject->data.area += (*findIter)->data.area; newObject->data.rect = newRect; double rectArea = newObject->data.rect.width * newObject->data.rect.height; newObject->ratio = rectArea / newObject->data.area; delete (*findIter); //erase() gibt einen gültigen Iterator auf das nächste Element zurück //Hier passiert wohl der Fehler: findIter = ObjectList.erase( findIter ); delete (*iter); (*iter) = newObject; }
Code :1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29
void RoiDetector::determineCoherentText( void ) { for( std::list<DetectedObject*>::iterator iter = ObjectList.begin(); iter != ObjectList.end(); ++iter ) { if( (*iter)->isText() ) { std::list<DetectedObject*>::iterator findIter = ObjectList.begin(); nextFindIterObjekt( findIter, iter ); while( findIter != ObjectList.end() ) { if( (*findIter)->isText() && findIter != iter ) { if( isNeighbour( (*iter), (*findIter) ) ) { updateObjectList( iter, findIter ); }else { nextFindIterObjekt( findIter, iter ); } }else { nextFindIterObjekt( findIter, iter ); } } } } }
Und hier noch der Vollständigkeits wegen der iterator inkrementierer:
Code :1 2 3 4 5 6
void RoiDetector::nextFindIterObjekt( std::list<DetectedObject*>::iterator& findIter, std::list<DetectedObject*>::iterator& iter ) { ++findIter; if( findIter == iter && iter != ObjectList.end() ) ++findIter; }
Ich kann nicht nachvollziehen warum es nur bei bestimmten Konstelationen zu diesem Fehler kommt...
Hat jemand Erfahrungen mit den Listen? Und kennt den Fehler?
Vielen Dank und liebe Grüße
RuFF
//--------------------------------------------------------------------------------------------------------------
Irrelevante Zusatzinfos:
Es geht um ein automatisiertes Bildverarbeitungs Programm, welches Objekte erkennen soll. Hier werden die erkannten Textobjekte zusammengeführt, falls es sich, um einzelnen Buchstaben handelt die nahe beieinander stehen...
//--------------------------------------------------------------------------------------------------------------Geändert von RuFFnEcK (29.09.09 um 16:16 Uhr)
-
Ähm *hust* Hab den Code oben mal schnell editiert

Es gab da noch einen kleinen Dreher, auf den ich hier mal nicht weiter eingehen will
Hat sich erledigt der Code oben t getz einwandfrei *g*
Kleiner Tipp an alle: Achtet immer auf die Reihenfolge der Parameter!
Im Projekt hab ich natürlich die Reihenfolgen inzwischen angepasst
Geändert von RuFFnEcK (29.09.09 um 16:18 Uhr)
Ähnliche Themen
-
[c++] Problem mit Iterator bei Anwendung der Funktion erase() auf container vector
Von Mizi Mace im Forum C/C++Antworten: 15Letzter Beitrag: 10.11.08, 14:33 -
Problem beim Speichern von langen Texten
Von Sasser im Forum PHPAntworten: 11Letzter Beitrag: 17.09.08, 02:33 -
Fehler bei string.erase()
Von Neogen1 im Forum C/C++Antworten: 4Letzter Beitrag: 17.04.08, 20:31 -
Problem mit langen Einträgen im Guestbook (wordwrap)
Von Bardiel im Forum PHPAntworten: 4Letzter Beitrag: 07.02.06, 22:58 -
STL List erase() crasht
Von jccTeq im Forum C/C++Antworten: 4Letzter Beitrag: 17.02.05, 09:49





Zitieren
Login






