Exception Handling: Fehler werden nur manchmal gecatched :-(((
-
CStatorwicklung::~CStatorwicklung() { //fwickelkopf ist Member (Zeiger auf CWickelkopf) if(fwickelkopf) delete fwickelkopf; }Was heißt das jetzt genau? fwickelkopf ist ein Mitglied von CStatorwicklung oder nur ein Zeiger auf eine CStatorwicklung? Im letzteren Fall gehört ein delete eigentlich nicht in den Destructor. In jedem Fall ist aber eine Initialisierung des Zeigers hilfreich. Gehe dazu einmal alle deine Konstruktoren durch.
-
Dann wurde dieser Zeiger offenbar nie initialisiert, weder mit NULL noch mit einem durch new erstellten Zeiger.
Jungs, dat is et!
Im Standard-Konstruktor von CStatorwicklung steht zwar "new CWickelkopf()", aber es wird ein andere Konstruktor von CStatorwicklung aufgerufen, der nur in der Headerdatei definiert wurde. Schnell rüber damit in die cpp :D. Dort fehlte natürlich ein "new CWickelkopf()".
Danke für die schnelle Hilfe. Ich werde jetzt speziell noch weiter nach dieser Art von Fehler suchen und hoffen, dass dann alle Exceptions richtig erkannt werden!!!
-
KeineAhnung78 schrieb:
Dort fehlte natürlich ein "new CWickelkopf()".
Das heißt, du machst in CTor new, und im DTor delete?
Warum nicht einfach ein CWickelkopf-Member? So wenig Zeiger wie möglich.
-
MFK schrieb:
KeineAhnung78 schrieb:
Dort fehlte natürlich ein "new CWickelkopf()".
Das heißt, du machst in CTor new, und im DTor delete?
Warum nicht einfach ein CWickelkopf-Member? So wenig Zeiger wie möglich.
fwickelkopf ist ein Member, aber eben ein Zeiger. Du meinst, CWickelkopf sollte Member sein und nicht CWickelkopf* ???
Es klappt immer noch nicht

Jetzt kann zwar delete ausgeführt werden, weil das Objekt existiert, aber aus dem Destruktor von CWickelkopf
CWickelkopf::~CWickelkopf() { cout << "Destruktor Wickelkopf" << endl; }komme ich nicht wieder raus. Mit beenden dieser Funktion crasht auch das Programm.
Himmel, seit Jahre programmiere ich mit dieser Struktur und nun hab ich doch irgendwo nen ganz schönen Mist drinnen...
-
KeineAhnung78 schrieb:
fwickelkopf ist ein Member, aber eben ein Zeiger. Du meinst, CWickelkopf sollte Member sein und nicht CWickelkopf* ???
Genau.
KeineAhnung78 schrieb:
Mit beenden dieser Funktion crasht auch das Programm.
Geht's etwas genauer als "es crasht"?
-
MFK schrieb:
KeineAhnung78 schrieb:
Mit beenden dieser Funktion crasht auch das Programm.
Geht's etwas genauer als "es crasht"?
Äh ja :).
Ich hangele mich langsam mit F11 durch den Code und nachdem die Destruktoren der Basisklassen durch sind, kommt ein Visusl Studio Tab mit dem Text:
Aufruflistenort:
moca.exe!CWickelkopf::'scalar deleting destructor'() + 0x2b Bytes
-
KeineAhnung78 schrieb:
Ich hangele mich langsam mit F11 durch den Code und nachdem die Destruktoren der Basisklassen durch sind, kommt ein Visusl Studio Tab mit dem Text:
Aufruflistenort:
moca.exe!CWickelkopf::'scalar deleting destructor'() + 0x2b BytesUnd was passiert da?
-
Zum Thema 0xCDCDCDCD:
http://www.microsoft.com/msj/1198/c/c1198.aspx
http://www.nobugs.org/developer/win32/debug_crt_heap.htmlD.h. 0xCDCDCDCD ist Speicher der alloziert aber nicht initialisiert wurde.
D.h. wenn eine Member-Variable 0xCDCDCDCD ist, kann man fast davon ausgehen, dass das Objekt nicht (vollständig) konstruiert wurde.Wie es in deinem Programm passieren kann, dass ein Objekt zerstört wird, welches nicht vollständig konstruiert wurde, musst du selbst rausfinden.
EDIT: upps, das Thema 0xCDCDCDCD is ja schon durch. Sorry, mehr hab' ich auf die Schnelle nicht anzubieten.
-
MFK schrieb:
KeineAhnung78 schrieb:
Ich hangele mich langsam mit F11 durch den Code und nachdem die Destruktoren der Basisklassen durch sind, kommt ein Visusl Studio Tab mit dem Text:
Aufruflistenort:
moca.exe!CWickelkopf::'scalar deleting destructor'() + 0x2b BytesUnd was passiert da?
Ich komme da dann nicht mehr weiter. Selbst mit dem kleinsten Schritt F11 nicht. Komische Sache, wieso sehe ich keine Quellcodezeile mehr? Oje...ich versteh den Debugger nicht.
-
KeineAhnung78 schrieb:
Komische Sache, wieso sehe ich keine Quellcodezeile mehr?
Weil dein Programm nicht nur aus deinem Code, sondern auch aus jeder Menge Library-Code besteht. Und für den hat der Debugger oft nicht den Quellcode verfügbar.
Lass das Programm doch einfach mal weiterlaufen. Wenn etwas schlimmes passiert, wird sich der Debugger schon melden.
-
Kannst auch mit (IIRC) Debug > Windows > Disassembly (Alt+8) den Assemblercode angucken, wenn du daraus schlau wirst.
-
Ich muss noch ein wenig basteln, aber es scheint so zu sein, dass alle Fehler auf die Destruktoren zurückzuführen sind, in denen eine delete auf Zeiger ausgeführt wird, die zwar ungleich NULL sind, aber zu denen kein Objekt existiert.
Ich danke euch für die zahlreichen Antworten...falls es das doch nicht ist, werde ich hier wieder rumheulen

-
Hast du ein 64 Bit Betriebssystem?
-
Hallo,
KeineAhnung78 schrieb:
Ich muss noch ein wenig basteln, aber es scheint so zu sein, dass alle Fehler auf die Destruktoren zurückzuführen sind, in denen eine delete auf Zeiger ausgeführt wird, die zwar ungleich NULL sind, aber zu denen kein Objekt existiert.
Du hast also:
class CStatorwicklung { public: CStatorwicklung (); ~CStatorwicklung (); .... private: CWickelkopf* mWickelkopf; };In diesem Fall würde ich auf jeden Fall den Member 'mWickelkopf' im Konstruktor von 'CStatorwicklung' initialisieren.
CStatorwicklung::CStatorwicklung() : mWickelkopf (NULL) { }Ich initialisiere prinzipiell alle Members innerhalb des Initialisierungsteils des Konstruktors. Das hat einige Vorteile:
- Egal ob Debug oder Release hast Du so immer das gleiche Verhalten
- Du siehst viel besser dass das Objekt gar nicht erzeugt wurde
- Das Programm crasht dann dort wo der erste Zugriff erfolgt und nicht erst beim Aufruf des Destruktors.Herzliche Grüsse
Walter