Einfach verkettete Liste



  • Hi,
    also ich habe eine verkettete Liste im Einsatz und muss den reservierten Speicher auch wieder freigeben allerdings klappt das nicht, denn das Programm stürtzt ab.

    Token *Help1 = m_Tokens;
    Token *Help2 = m_Tokens;
    while ( Help1 != NULL )
    {
    	Help2 = Help1;
    	Help1 = Help1->Next;
    	delete Help2;
    }
    
    if ( Help1 == m_Tokens )
    {
    	delete m_Tokens;
    	m_Tokens = NULL;
    }
    else
    {
    	delete Help1;
    	Help1 = NULL;
    }
    
    Token *Show = m_Tokens;
    
    while ( Show != NULL )
    {
    	printf( "%i ", Show->Token );
    	Show = Show->Next;
    }
    

    Jemand eine Idee was hier falsch sein könnte!? Ich bin am Verzweifeln. Vielleicht ist der Speicher ja jetzt freigegeben? Aber dann dürfte die while Schleife ja nicht mehr ausgeführt werden, was sie aber wird 😞

    Danke im Voraus

    Gruß



  • 1. delete ist kein C, sondern C++!
    2. setzt delete den gelöschten Zeiger nicht auf NULL
    3. steht nach der while-Schleife doch fest, wenn sie beendet wird, dann ist Help1 == NULL
    4. hast du mal einen Debugger bemüht?



  • wie wärs rekursiv?

    void macheskaputt(Knoten* knoten) {
        if(knoten->next)
            macheskaputt(knoten->next);
        delete knoten; // oder free, je nach dem
    }
    

    ok ist doof, dann eben so:

    void macheskaputt(Knoten* knoten) {
        while(knoten) {
            Knoten * next = knoten->next;
            delete knoten; // oder whatever anstatt delete
            knoten = next;
        }
    }
    


  • Hi,
    erstmal danke für eure Antworten 🙂

    rüdiger schrieb:

    1. delete ist kein C, sondern C++!
    2. setzt delete den gelöschten Zeiger nicht auf NULL
    3. steht nach der while-Schleife doch fest, wenn sie beendet wird, dann ist Help1 == NULL
    4. hast du mal einen Debugger bemüht?

    1. Ja ich weiß, denk dir dort den entsprechenden C-Teil 🙂
    2. Okay, wusste ich nicht.
    3. Ja aber sie wird ja trotzdem ausgeführt, also ist etwas noch nicht gelöscht worden.
    4. Ja, aber bringt mich nicht weiter

    Ich habe nun folgendes geschrieben:

    if ( m_Tokens != NULL )
    {
    	class Token *Pointer1 = NULL, *Pointer2 = NULL;
    	Pointer1 = m_Tokens->Next;
    	while ( Pointer1 != NULL )
    	{
    		Pointer2 = m_Tokens->Next->Next;
    		m_Tokens->Next = Pointer2;
    		Pointer1 = Pointer2;
    	}
    	free( m_Tokens );
    	m_Tokens = NULL;
    }
    else
    {
    	fprintf(stderr,"Error: Keine Liste zum Loeschen vorhanden!\r\n");
    }
    
    class Token *Show = m_Tokens;
    
    while ( Show != NULL )
    {
    	printf( ": %i ", Show->Token );
    	Show = Show->Next;
    }
    

    Das scheint zu klappen zumindest wird die Schleife zum Schluss nicht mehr ausgeführt. Aber ist das so richtig oder kann mir da noch etwas um die Ohren fliegen? Oder kann ich nun endlich sicher sein, dass ich alles gelöscht habe oder habe ich noch immer ein Speicherleak? Gibts eine Möglichkeit GANZ sicher herauszufinden, ob es noch Speicherleaks gibt?

    Vielen Dank

    Gruß


Log in to reply