Listeneintrag löschen ergibt eine Zugriffsverletzung...



  • Hallo!
    Ich habe eine Frage und zwar bin ich grade dabei mir C++ beizubringen und habe jetzt versucht ein Programm zu schreiben, in dem eine Liste erstellt wird (doppelt Verkettet). Die Einzelnen Elemente bestehen aus Strukturen:

    struct Data
    {
    	char Text[80];
    };
    
    struct Node
    {
    	Data data;
    	Node* next;
    	Node* previous;
    };
    

    Von der Main Funktion kann man (unter anderem) die folgende Funktion aufrufen:

    void DeleteEntry(char* Text)
    {
    	Interator = Start;
    	do
    	{
    		if(strncmp(Interator->data.Text, Text, 80) == 0)
    		{
    			Interator->previous->next = Interator->next;
    			Interator->next->previous = Interator->previous;
    			cout << "Eintrag \"" << Interator->data.Text << "wird gelöscht (Adresse: " << &Interator << ")";
    			delete Interator;
    			Interator = 0;
    			return;
    		}
    		Interator = Interator->next;
    	}while(Interator->next != 0);
    }
    

    Und hier liegt mein Problem und zwar kommt immer wenn ich ein ein Item lösche eine Fehlermeldung

    Unbehandelte Ausnahme bei 0x004118f0 in Tut-C++ - structList.exe: 0xC0000005: Zugriffsverletzung beim Schreiben an Position 0xcdcdce1d.
    

    Wenn ich jetzt in den Code gehe und schaue, hat bei der DeleteEntryFunktion "Interator->previous->next" Next keinen Wert, obwohl dieser doch vorhanden sein sollte oder?
    Eigentlich sollte "Iterator->previous->next" doch die Adresse von Interator enthalten oder? (Und die soll ja auf den Wert des darauf folgenden Elements geändert werden, sodass in der Liste kein Lücke entsteht)

    Kann mir jemand sagen was ich falsch gemacht habe?

    MFG
    Neokil



  • Verwende einen Debugger um nachzuschauen, in welcher Zeile die Zugriffsverletzung wirklich auftritt.

    Danach kannst du im Debugger auch mal Schritt fuer Schritt verfolgen, was bei einem Trivialbeispiel (z. B. Liste aus nur 2 Elementen) passiert, wenn du ein Element loescht.

    EDIT: wenn du nicht weisst was ein Debugger ist, wirds Zeit das zu lernen. Du musst uns aber sagen welche IDE du benutzt, damit wir wissen welchen Debugger du hast. Ansonsten einfach nach einem Tutorial zu "Debugging + $IDE" googeln



  • Was soll ein Interator sein? Du meinst sicher Iterator.

    In deiner DeleteEntry() -Funktion, wo hast du Interator deklariert? Mach das lokal, der muss ausserhalb nicht bekannt sein. Dann müsstest du ihn auch nicht auf Null setzen, nachdem du delete angewendet hast.

    Ich würde es auch mal mit dem Debugger versuchen, besonders in der Zeile, in der die Fehlermeldung kommt. Prüfe die umliegenden Variablen, überlege dir, welche Werte sie haben sollten. Notfalls kannst du auch cout -Ausgaben einbauen, aber das ist etwas mühsamer.



  • Also Danke erst mal das mit dem Debugger werde ich machen (IDE: Visual Studio 2008 Pro). Ich habe gedacht ich hätte vielleicht einen so offensichtlichen Fehler gemacht, dass ich mir das ewige Gesuche ersparen könnte.

    MFG
    Neokil



  • Neokil schrieb:

    Also Danke erst mal das mit dem Debugger werde ich machen (IDE: Visual Studio 2008 Pro). Ich habe gedacht ich hätte vielleicht einen so offensichtlichen Fehler gemacht, dass ich mir das ewige Gesuche ersparen könnte.

    MFG
    Neokil

    Naja. Das ist schwer zu sagen bei solchen Sachen, weil man schon den gesamten Code sehen müsste. Aber ich würde mal darauf tippen, dass du da grausam was mit den Zeigern falsch machst. 😉

    Überprüf z.B ob die Nodes mit 0 initialisiert werden und das du keinen unerlaubten Zugriff drauf hast. (Sprich auf einen 0 Zeiger etwas anwenden willst).


Anmelden zum Antworten