[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