[Verkettete Liste] Fehler im DebugModus



  • Hallo!

    Also ich habe mir eine Liste gebastelt, allerding schmiert sie im Debug Modus (MS VC++6.0) ab.
    Im Releasemodus scheint alles ok zu sein (kein absturz).
    Das Problem liegt in der DeleteAll Methode, schaut doch bitte m,al nach ob ich da irgendwas grob falsch mache.

    //	Listenelement (klassen.h)
    class C_Node
    {
    public:
    	C_Node(C_Daten* neueDaten);
    	~C_Node();
    	void Insert(C_Daten* neueDaten);
    	C_Node* Delete(C_Daten* deleteDaten);
    	void DeleteAll();
    private:
    	C_Daten* myData;
    	C_Node* myNext;
    	C_Node* myPrevious;
    };
    
    //	TEMP
    class C_Daten
    {
    public:
    	C_Daten(char newchar){myChar = newchar;}
    private:
    	char myChar;
    };
    
    //	NODE (klassen.cpp)
    C_Node::C_Node(C_Daten* neueDaten)
    {
    	myNext = NULL;
    	myPrevious = NULL;
    	myData = neueDaten;
    }
    
    C_Node::~C_Node()
    {
    	delete myData;
    }
    
    void C_Node::Insert(C_Daten* neueDaten)
    {
    	if (!myPrevious)
    	{
    		myPrevious = new C_Node(neueDaten);			//	neuen Knoten erzeugen und auf ihn mit myPrevious verweisen
    		myPrevious->myNext = this;					//	neuen Knoten mit myNext auf erzeugendes Objekt verweisen lassen
    		myPrevious->myData = neueDaten;				//	Datenobjekt einfügen
    	}
    	else
    	{
    		myPrevious->Insert(neueDaten);
    	}
    }
    
    C_Node* C_Node::Delete(C_Daten* deleteDaten)
    {
    	C_Node* pFirst = this;							//	TEMP Pointer um ggf. andere Head-Adresse zurückzugeben.
    	if (deleteDaten == myData)						//	Wenn dies Objekt zu löschen ist...
    	{
    		if (myNext == NULL)							//	...und es kein nächstes Objekt gibt...
    		{
    			pFirst = myPrevious;					//	...gib als Startpointer die Adresse des nächsten Objektes zurück.
    			myPrevious->myNext = NULL;				//	Dem Nachfolge Objekt wird mitgeteilt, dass es keinen Vorgänger mer hat.
    			delete this;							//	Zerstöre dich selbst!
    		}
    		else
    		{
    			myPrevious->myNext = myNext;			//	Andernfalls bekommt es die Adresse des Vorgängerknotens mitgeteilt.
    		}
    	}
    	else
    	{
    		pFirst = myPrevious->Delete(deleteDaten);
    	}
    
    return pFirst;
    }
    
    void C_Node::DeleteAll()
    {
    	if (myPrevious)
    	{
    		myPrevious->DeleteAll();
    		if (!myNext) return;
    		delete this;
    	}
    }
    
    #include <iostream>
    
    #include "klassen.h"
    
    using namespace std;
    
    int main()
    {
    	char* pChar = new char;
    	C_Daten* pDaten;
    	C_Node* pLinkedList;
    
    	cout << "Bitte ein Zeichen eingeben: ";
    	cin >> pChar;
    	pDaten = new C_Daten(*pChar);
    	pLinkedList = new C_Node(pDaten);
    
    	for (int i=0; i<3; i++)
    	{
    		cout << "Bitte ein Zeichen eingeben: ";
    		cin >> pChar;
    		pDaten = new C_Daten(*pChar);
    		pLinkedList->Insert(pDaten);
    	}
    
    	pLinkedList->DeleteAll();
    
    delete pLinkedList;
    delete pChar;
    return 0;
    }
    

    Besten dank!



  • Warum benutzt du nicht einfach mal den Debugger?



  • geh mal Zeichenweise vor und schick dann einfach die paar problematischen Zeilen



  • MFK schrieb:

    Warum benutzt du nicht einfach mal den Debugger?

    Im Releasemode schwer, nech?? ;P

    Im Debugmode hab ich da ja gamecht, da stürzt es ab, sobald das letzte Listenelem,ent vernichtet werden soll.

    void C_Node::DeleteAll() 
    { 
        if (myPrevious) 
        { 
            myPrevious->DeleteAll(); 
            if (!myNext) return; 
            delete this; 
        } 
    }
    

    Das ist der problematische Teil!
    Aber wie gesagt nur im debugmode, im releasemode scheint(!!) alles wunderbar zu laufen.... 😕



  • Ich würd mal sagen:

    Versuchs ohne delete this



  • er stürzt bei
    delete pchar ;

    ab.

    als workaround würde ich ein
    char pChar;
    benutzen, aber warum er das tut, dafür ist es mir jetzt zu spät 😉



  • cin >> pChar

    durch

    cin >> *pChar ersetzen

    Oder besser das was elise schrieb.

    Für was brauchst Du das delete this ?



  • Knuddlbaer schrieb:

    Für was brauchst Du das delete this ?

    Ohne das "delete this;" würde die methode keinen sinn ergeben, weil sich das objekt nicht vernichtet 😉
    Das Vorhaben war ja, dass ich nur eine Klasse brauche für eine komplett funktionierende Verkettete Liste.

    Aber ihr habt recht, so klappts, thx ^^
    mal wieder ein ziemlich banaler Fehler ^^#

    PS: Falls wer grundlegende verbesserungsvorschläge hat, nur zu ^^



  • Ah jetzt ja



  • Warum benutzt du nicht einfach mal den Debugger?

    Im Releasemode schwer, nech?? ;P

    Es soll auch möglich sein, die Release Version zu debuggen. Schau mal unter:

    http://www.codeguru.com/debug/index.shtml
    http://www.codeguru.com/debug/release_ver.shtml



  • wg. delete this:
    Wie verhinderst du, dass C_Node-Objekte auf dem Stack oder statisch erzeugt werden?



  • tja, das ist in der Tat ein Problem... Vorallem für die Delete Methode...
    "Verhindert" wird es im Moment nur so, dass ich es nicht mache 😢


Anmelden zum Antworten