WIN32 GUI project stürzt beim beenden ab??



  • Pferdmann schrieb:

    Also habe mal pauschal alle delete in delete[] umgewandelt, also auch die, eigentlich pointer freigeben sollen.

    Genial. 🙄

    Nun kommt nach dem Schließen keine Fehlermeldung mehr, aber die Konsole zeigt auch nicht den normalen Text ("Process stopped..." oder so) an. Der debugger meldet an sich gar keinen Fehler, bzw. warnings...

    Das ist auch nicht seine Aufgabe, die Fehlermeldungen kommen vom Compiler oder Linker. Der Debugger ist dazu da, das Programm während der Ausführung zu stoppen, schrittweise ablaufen zu lassen und dabei den Speicher zu untersuchen. Damit findet man auch solche Fehler.

    Gratulation übrigens, dass du es so weit ohne Debugger geschafft hast!



  • Ok habe das jetzt noch mal mit dem Debugger versucht und alle delete so geschreiben, wie sichs gehört.
    Ich bekomme beim schließen folgende meldung in einem Kasten (Call Stack) angezeigt:

    #0 7702E3BE ntdll!LdrVerifyImageMatchesChecksumEx(
    (C:\Windows\system32\ntdll.dll:??)
    #1 ?? ?? () (??:??)

    und unten rechts fährt ein kleines Fenster hoch, das meldet:
    Program received signal SIGSEGV, Segmentation fault

    damit kann ich nur nicht viel anfangen...

    ich hätte noch zusätzlich mal eine frage:
    angenommen ich habe eine Klasse A, die auf einer Basisklasse B basiert.
    Nun habe ich in einer Funktion (innerhalb der Klasse 😎 als Parameter einen Pointer auf die Basisklasse B. Kann ich dann auch einen Pointer der "normalen" Klasse A übergeben? Scheint zu funktionieren, ich verstehe nur nicht, warum, bzw. frage ich mich, ob da der Fehler liegt??



  • Zu Deiner zusätzlichen Frage: Wenn Du eine abstrakte Basisklasse "Lebewesen" und davon abgeleitete konkrete Klassen "Mensch" und "Tier" hast, kannst Du dir vorstellen, das ein Zeiger auf "Lebewesen" immer auf einen "Mensch" oder ein "Tier" zeigen muss, da ja ein "Lebewesen" nicht als Objekt erstellt werden kann, ist ja abstrakt. Das ist etwas Grundsätzliches in der objektorientierten Softwareentwicklung.

    Da Du in dieser Hinsicht noch unsicher bist, kann es ja sein, dass Du bei der Ableitung von Klasse "A" etwas machst, was zu einem Absturz führt. Ist z.B. der Destruktor virtuell? Sollte er sein, damit bei einem "B"-Zeiger auf ein "A" beim löschen (delete) auch der Destruktor von "A" abgearbeitet wird.
    Wenn Du virtuelle Methoden hast, rufe diese erstmal nicht in einem Konstruktor oder Destruktor auf. Destruktoren werden (bei nicht virtueller Vererbung) in der Regel von Unterklassen zuerst und dann von der nächsten Oberklasse in Richtung Basisklasse abgearbeitet. Konstruktoren von der Basisklasse in Richtung der Unterklassen.

    Beispiel: Basisklasse "B" hat eine virtuelle Methode 'tuWas()' welche im Destruktor aufgerufen wird. In abgeleiteter Klasse "A" wird die Methode 'tuWas()' überschrieben und greift auf Daten von Klasse "A" zu. Wenn jetzt beim löschen von einem Objekt des Typs "A" zuerst der Destruktor aufgerufen wird, welcher alles aufräumt, was "A" betrifft und jetzt im folgenden Aufruf des Destruktors von "B" durch den Aufruf der virtualen Methode 'tuWas()' in "A" auf Daten vom KAPUTTEN "A" zugegriffen wird…..!

    Gruß Helmut



  • Also in Klasse B werden nur im Konstruktor Pointer erzeugt, auf denen wiederum die Adressen anderer Objekte der Klasse A gespeichert werden.
    Habe nun den Inhalt des Desktruktors der Klasse B in Klasse A verschoben, da das ja an sich kein Problem sein sollte?? (In dem Destruktor wird nur der Speicherplatz der Pointer freigegeben...)
    Mit Hilfe von printf habe ich nun festgestellt, dass nun alle Destruktoren aufgerufen werden (davor wurde nur der, des als letztes initialisiertes Objekts aufgerufen, danach kam die Fehlermeldung), aber jetzt ist wieder etwas komisch-->

    Konstruktor Gatter
    Konstruktor Gatter
    Konstruktor Gatter
    Konstruktor Gatter
    Konstruktor Gatter
    Konstruktor Gatter
    Konstruktor Gatter
    ______Konstruktor Oder
    Konstruktor Gatter
    _______Konstruktor UNd
    Konstruktor Gatter
    ________Konstruktor Nand
    Konstruktor Gatter
    _______Konstruktor UNd
    Konstruktor Gatter
    ________Konstruktor Nand
    Konstruktor Gatter
    ______Konstruktor Oder
    ________Desktruktor Oder
    Desktruktor GAtter
    Desktruktor GAtter
    Desktruktor GAtter
    _______Desktruktor Nand
    Desktruktor GAtter
    Desktruktor GAtter
    Desktruktor GAtter
    ________Desktruktor Und
    Desktruktor GAtter
    Desktruktor GAtter
    Desktruktor GAtter
    _______Desktruktor Nand
    Desktruktor GAtter
    Desktruktor GAtter
    Desktruktor GAtter
    ________Desktruktor Und
    Desktruktor GAtter
    Desktruktor GAtter
    Desktruktor GAtter
    ________Desktruktor Oder
    Desktruktor GAtter
    Desktruktor GAtter
    Desktruktor GAtter

    (Fehlermeldung erscheint jetzt!)

    Process returned -1073741819 (0xC0000005) execution time : 6.220 s
    Press any key to continue.

    Warum wird der Gatterdestruktor jetzt immer drei mal aufgerufen?


  • Mod

    Zeig mal Code! Hast du auch dran gedacht, eine Ausgabe im Kopierkonstruktor einzubauen? Das sind doch sehr viele Destruktoraufrufe für so wenige Konstruktionen.



  • Also das mit dem Code will ich eigentlich niemandem antun, da es allein zwei lange Header- und zwei viel längere c++ Dateien sin, auf die es bei dem Problem, glaube ich ankommt. Falls du drauf bestehst, kann ichs dir aber gerne schicken 🙂
    Also einen Copy-Konstruktor gibt es schon, aber der wird in dieser Version, des Programms nicht verwendet. Den kann man auch rauslöschen, es läuft trotzdem und das Problem tritt immer noch auf....


  • Mod

    Pferdmann schrieb:

    Also einen Copy-Konstruktor gibt es schon, aber der wird in dieser Version, des Programms nicht verwendet.

    Oh doch.

    Den kann man auch rauslöschen, es läuft trotzdem und das Problem tritt immer noch auf....

    Mach ihn mal private und staune 😉 . Siehe:
    http://en.wikipedia.org/wiki/Special_member_functions



  • Aber wenn ich beim Kopierkonstruktor eine printfanweisung reinschreibe, kriege ich bei der Konsole trotzdem keine Augabe und ob der Kopierkonstruktor public oder private is, macht an sich keinen Unterschied, bzw. meckert der Compiler halt nich...


  • Mod

    Dann können wir bloß weiter rum raten. Das will wohl niemand. Entweder kannst du das Problem auf ein präsentierbares Minimalbeispiel herunterbrechen (siehe: http://www.c-plusplus.net/forum/304133 ) oder du musst eben selber debuggen. Es dürfte übrigens auch mit an Sicherheit grenzender Wahrscheinlichkeit funktionieren, wenn du den gesamten Code umschreibst unter der Berücksichtigung von Nathans Kommentar bezüglich modernem C++.



  • Also, habe nun noch mal komplet alle Destruktoren durchgesehen und tatsächlich bei einer Datei vergessen, diesen zu überprüfen (hab diese immer übersehen, erst zum Schluss is mir eingefallen, dass ich die noch nich angeschaut habe) und es lag an den [], also das Problem war, dass da welche waren, aber es nur ein Pointer war, dessen Adresse gelöscht werden sollte.

    Auf jeden Fall geht es jetzt, danke an alle, für eure Ratschläge 🙂


Anmelden zum Antworten