Wieso stürzt das Programm ab?
-
Schau doch mal mit dem Debugger, wo das Programm genau abstürtzt..
-
Ad aCTa schrieb:
Bei dem Code stürzt das Programm ab, wieso?
weil irgendwo ein fehler ist
-
Naja, ich kann im Konstruktor von BinTree faktisch alles löschen und es kommt trotzdem zum Absturz.
Unbehandelte Ausnahme bei 0x0040124d in BinTree.exe: 0xC0000005: Zugriffsverletzung beim Lesen an Position 0xbaadf00d.
Ich muss irgendwas mit den Zeigern verwurschtelt haben.
Der Fehler passiert nicht, wenn ich die Kurzform des Konstruktor-Aufrufes verwende:
BinTree<Client> b1(); // statt BinTree<Client> b1 = BinTree<Client>();Aber dann mit der Warnung:
Warnung 1 warning C4930: 'BinTree<T> b1(void)': Funktion mit Prototyp wurde nicht aufgerufen (war eine Variablendefinition gemeint?) c:\Dokumente und Einstellungen\Ad aCTa\Desktop\C++\BinTree\BinTree\main.cpp 8
Hä?

-
Das sind ja auch zwei verschiedene Dinge.
BinTree<Client> b1();deklariert eine Funktion namens b1 ohne Parameter welche ein BinTree<Client> Objekt zurückgibt. Das sagt auch die Warnung.
-
BinTree<Client> b1();sieht doch verdammt nach :
int foo ();aus, nicht? Klingelts?
Zu dem Fehler. Debug die Applikation einfach mal und geh alle Konstruktoren durch. (Das ist ja das einzige, was du überhaupt machst). Dann siehst du genau, wo der Fehler liegt.
-
Tja und jetzt?
Ich kann zum Verständis sagen, was ich von dem Code will:

Wenn der Konstruktor von BinTree aufgerufen wird, soll in BinTree::root ein Zeiger eines neu erstellten Root-Objektes gespeichert werden.
root = new Root<T>();Wird der Root-Konstruktor dadurch wiederrum aufgerufen, so soll dieser in Root::next eine Adresse eines neu erzeugten TreeNode-Objekts speichern, dabei übergibt er seine eigene Adresse an TreeNode.
next = new TreeNode<T>(this);Dieses Objekt schreibt in seinem Konstrukor die Adresse wiederrum in seinen prev-Zeiger, der next von TreeNode wird erst befüllt, wenn Append aktiviert wird.
this->prev = prev // Parameter des KonstruktorsIch habe cout-Ausgaben überall in jedem Konstruktor erfolgreich ausführen können, wie gesagt, das Programm stürzt immer ab, egal, ob was im Konstruktor von BinTree steht. Damit ist der Fehler ja irgendwo dort, bloß wo?
-
Ich habe cout-Ausgaben überall in jedem Konstruktor erfolgreich ausführen können, wie gesagt, das Programm stürzt immer ab, egal, ob was im Konstruktor von BinTree steht. Damit ist der Fehler ja irgendwo dort, bloß wo?
Wie viel mal muss ich es noch sagen:
Schalte den Debugger an und geh einfach von Anfang an jeden Schritt durch.. Dann wirst du früher oder später den Fehler kriegen.. Und dann weisst du auch, wo der ist..
-
Der Fehler lag im Destruktor von BinTree, ich weiß nur nicht, was der Compiler gegen delete root; hat! Ohne das ist mein Programm ein riesiges Speicherleck, wieso will der Compiler das nicht?
-
Ganz einfach. Du erzeugst ja 2 Objekte vom Typ BinTree. Im ctor wird da Speicher angefordert und in root gespeichert. Das ist gut so. Dann kommt aber das Problem, dass du keinen Zuweisungsoperator definiert hast und daher erzeugt dir dein Compiler einen. Nur der weiss nicht, was du da für Variablen hast, respektive wer die Verwantwortung für den Speicher hat usw. Also kopiert er einfach alles 1:1. Sprich du hast 2 Objekte vom Typ BinTree und beide beinhalten einen Zeiger auf denselben Speicherbereich. Der erste zerstört den Bereich und der zweite probiert dasselbe und das ist undefiniert, respektive ergibt meist einen Laufzeitfehler.
Daher gilt die Regel, dass du, wenn du deinen der Konstruktoren definierst, die anderen ebenfalls definierst.
Hier findest du auch, wie man das richtig macht:
http://tutorial.schornboeck.net/bigthree.htmbtw:
Der Compiler hat mit dem schon lange nichts mehr zu tun. Sobald eine exe da ist, ist der Compiler unbeteiligt..
-
Oh gott, darauf muss man erst mal kommen, danke!