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:
Das kann aber nicht sein, da vorher darauf geprüft wird!
Hier erstmal die Funktion, wo der fehler passiert:
Und hier noch der Vollständigkeits wegen der iterator inkrementierer:
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...
//--------------------------------------------------------------------------------------------------------------
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
Standard C++ Libraries Out of Range
Das kann aber nicht sein, da vorher darauf geprüft wird!
Hier erstmal die Funktion, wo der fehler passiert:
Code:
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:
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:
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...
//--------------------------------------------------------------------------------------------------------------
Zuletzt bearbeitet: