STL List erase() crasht

jccTeq

Erfahrenes Mitglied
Ich hab ein Problem in einem meiner Linux - Programme.

Ich habe eine Funktion, die sekündlich zyklisch aufgerufen wird. Sie iteriert über eine STL-List.

Die Elemente der Liste sind structs vom Typ Message.

Jede Message hat einen Timestamp Now, in welchem der Linux-Timestamp steht, an dem das Message-Objekt der STL List hinzugefügt wurde. Desweiteren hat jedes Message-Objekt einen Delay-Wert in Sekunden.

Jedes Mal, wenn die Funktion aufgerufen wird, wird überprüft, ob die Zeit Now + das Delay des jeweiligen Message-Objekts überschritten wurde. Dann soll mit den Werten des Message-Objekts ein bisschen was angestellt werden und das Message-Objekt selbst soll aus der STL List entfernt werden. Quasi eine zeitgesteuerte Message Queue also.

Das Problem ist, daß mir die erase()-Funktion der STL Liste immer abstürzt, wenn das letzte Element der Liste gelöscht werden soll.

Wichtig ist vielleicht noch die OnClose-Funktion da, welche aufgerufen wird, wenn bCloseConnection wahr ist. Diese Funktion löscht die eigene Instanz.

Daß die Funktion nach Löschen des Client-Objekts nicht nochmal aufgerufen wird, habe ich Sorge getragen. Das bestätigt mir auch die Ausgabe der Print-Meldungen.

Hier der Code:

Code:
void Client::SendDelayedMessages()
{
	fprintf(stderr,"SendDelayedMessages()\n");
	if(plDelayedMessages == NULL) return;

	list<Message>::iterator iMessage = plDelayedMessages->begin();
	while(!plDelayedMessages->empty() && iMessage != plDelayedMessages->end())
	{
		Message mMesg				= *iMessage;
		int iExecTime				= mMesg.Now + mMesg.Delay;
		int iRemaining				= iExecTime - (int)time(NULL);
		fprintf(stderr,"Size of lDelayedMessages : %i\n",plDelayedMessages->size());
		if( iRemaining <= 0 )
		{
			int iNewState 				= mMesg.NewState;
			char* text					= mMesg.msg;
			bool bClose					= mMesg.bCloseConnection;
			iMessage = plDelayedMessages->erase(iMessage); // Dieser Aufruf stürzt  ab, sobald die letzte Message in der Liste bearbeitet wird. 
			Send(text);
			if(iNewState >= 0) iState	= iNewState;
			if(bClose) OnClose();
			continue;
		}
		iMessage++;
	}
}
 
Kann es sein, daß man das letzte Element einer List nicht mit erase löschen darf?

Weil, ich überprüfe jetzt die Größe der Liste mit size() und wenn diese 1 ist, lösche ich die komplette Liste mit delete, anstatt das Element mit erase() aus der Liste zu entfernen.

Und das funktioniert so. Ist diese Vorgehensweise korrekt?
 
moin


Folgendes Beispiel:
Code:
#include <list>
#include <iostream>

int main( ) 
{
   using namespace std;
   list <int> c1;
   list <int>::iterator Iter;
   
   c1.push_back( 10 );
   c1.push_back( 20 );
   c1.push_back( 30 );
   c1.push_back( 40 );
   c1.push_back( 50 );
   cout << "Liste zum Anfang:";
   for ( Iter = c1.begin( ); Iter != c1.end( ); Iter++ )
      cout << " " << *Iter;
   cout << endl;

   c1.erase( c1.begin( ) );
   cout << "Nach löschen des ersten Elements:";
   for ( Iter = c1.begin( ); Iter != c1.end( ); Iter++ )
      cout << " " << *Iter;
   cout << endl;
   Iter = c1.begin( );
   Iter++;
   c1.erase( Iter, c1.end( ) );
   cout << "Nach löschen aller Elemente, bis aufs erste: ";
   for (Iter = c1.begin( ); Iter != c1.end( ); Iter++ )
      cout << " " << *Iter;
   cout << endl;

   cin.get();
   return 0;
}

Nun ist das erste auch das letzte Element, das ohne Probleme auch noch gelöscht werden kann.


mfg
umbrasaxum
 
Und aus welchem Grund stürzt dann mein Programm in der erase() Funktion ab, wenn ich versuche, das letzte Element zu löschen?
 
moin


Ich kann auch nur raten, aber bist du sicher das du die letzte löscht und nicht eine die nicht mehr vorhanden ist?


mfg
umbrasaxum
 
Zurück