std::list::erase() Problem bei zu langen Listen

RuFFnEcK

Erfahrenes Mitglied
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:

list iterator not dereferencable
sowie:
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:
Ähm *hust* Hab den Code oben mal schnell editiert :D
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 ;-)
 
Zuletzt bearbeitet:
Zurück