Windows-Error nach Programmende
HeavySkater 13.12.2001 - 13:57 1800 19
HeavySkater
Big d00d
|
Ich habe ein programm geschrieben, das ohne Probleme alles macht was es soll. Nach beenden das Programmes kommt so eine Windows-Fehler Meldung. (Die Fehlerbox hab ich eh als Attachment beigefügt)
Wenn ich am Schluss des programmes den Befehl: exit (1); hinschreibe, dann taucht diese Fehlermeldung nicht auf, was ist der Grund für diese Meldung?
error_2678.jpg (downloaded 55x)
|
ThoBay
Little Overclocker
|
Scheint ja ein C++ Programm zu sein, kenn mich mit C++ leider nicht aus. Aber soviel ich weiss, kann man mit dem exit(i) angeben, ob der Ausstieg "normal" oder "abnormal" definiert ist, kann sein dass 0 für abnormal steht und default is, nur wenn explizit 1 angegeben wird empfindet ers nicht als "abnormal termination" oder so was. Wie gesagt, ist nur so ne dunkle Erinnerung, könnte also auch absoluter Schwachsinn sein...
Vielleicht meldet sich ja hier nich jmd. zu Wort der sich besser auskennt (davon geh ich mal aus)
|
jb
Here to stay
|
Dann schreib einfach exit(1) wenns keinen Fehler gibt, Windoof scheint das zu brauchen....
|
Ringding
Pilot
|
Geh bitte, so ein Blödsinn! Die Assertion kommt, weil irgendein Destructor einen Crash verursacht (hast wohl irgendwas mit den Pointern verbockt) Lass es halt mal im Debugger laufen, und schau wo das passiert!
|
that
Hoffnungsloser Optimist
|
Irgendwo hast du Speicher überschrieben, der nicht dir gehört. Die Debug-Runtime checkt das beim Beenden.
|
Vir@s
Code Monkey
|
Des hat nix mit Speicherbereich überschreiben zu tun...
Du hast am Ende gar keine Exit Anweisung oder?
Und es in ein Win-Programm oder?
Windows will da unbedingt ne rückmeldung - sonst glaubts des sich des Programm gschossen hat oder irgend nen Plötzsinn gmacht hat...
Wennst sauber programmieren willst solltest sowieso immer mit exit oder return arbeiten!
Bye, Vir@s
|
that
Hoffnungsloser Optimist
|
Des hat nix mit Speicherbereich überschreiben zu tun... Doch. Die Assertion kommt aus der Debug-Version von "operator delete". Auszug: /* get a pointer to memory block header */ pHead = pHdr(pUserData); /* verify block type */ _ASSERTE(_BLOCK_TYPE_IS_VALID(pHead->nBlockUse));
|
Vir@s
Code Monkey
|
Doch. Die Assertion kommt aus der Debug-Version von "operator delete".
Auszug:
/* get a pointer to memory block header */ pHead = pHdr(pUserData);
/* verify block type */ _ASSERTE(_BLOCK_TYPE_IS_VALID(pHead->nBlockUse)); des muss aber ned von einem von erm verwendeten pointer sein... kann sein des des ****** Visual C++ speicher reserviert und ohne return oder exit meldung den speicher behält - sich des programm aber beendet und somit glaub windows des sich des programm selber raushaut [edit] außerdem wird durch exit(1); ned ein falsch geschriebener speicherbereich wieder in ordnung gebracht [/edit]
Bearbeitet von Vir@s am 13.12.2001, 19:55
|
that
Hoffnungsloser Optimist
|
[edit]
außerdem wird durch exit(1); ned ein falsch geschriebener speicherbereich wieder in ordnung gebracht
[/edit] Korrekt. Mit exit(1) wird das Programm an dieser Stelle einfach beendet, so dass später im Ablauf auftretende "delete" Aufrufe natürlich nicht mehr ausgeführt werden. D.h. das exit behebt das Symptom (Assertion beim delete), aber nicht die Ursache (überschriebene Kontrollstruktur der Speicherverwaltung).
|
Vir@s
Code Monkey
|
Korrekt. Mit exit(1) wird das Programm an dieser Stelle einfach beendet, so dass später im Ablauf auftretende "delete" Aufrufe natürlich nicht mehr ausgeführt werden. D.h. das exit behebt das Symptom (Assertion beim delete), aber nicht die Ursache (überschriebene Kontrollstruktur der Speicherverwaltung). Naja -- aber laut ANSI C++ sollten auch bei einem exit alle delete funktionen noch aufgerufen werden - is nur die Frage wie sehr sich des Visual C++ and ANSI hält
|
HeavySkater
Big d00d
|
Des Visual C++ ist ein Scheissdreck, der checkt gar nix der Compiler. Aber unsere Programmierlehrerin meint wir müssen Mircoshrott verwenden.
Mitn Borland Compiler ists chilliger.
Hab mitlerweile den Fehler gefunden, aber ich hab keine Ahnung wo er war. Langsam wirds unübersichtlich.
|
Vir@s
Code Monkey
|
Des Visual C++ ist ein Scheissdreck, der checkt gar nix der Compiler. Aber unsere Programmierlehrerin meint wir müssen Mircoshrott verwenden.
Mitn Borland Compiler ists chilliger.
Hab mitlerweile den Fehler gefunden, aber ich hab keine Ahnung wo er war. Langsam wirds unübersichtlich. Den einzigen rat den ich dir geben kann: Nach ANSI Standard programmieren, schön einrücken und KOMMENTARE SCHREIBEN Bye Vir@s
|
that
Hoffnungsloser Optimist
|
Naja -- aber laut ANSI C++ sollten auch bei einem exit alle delete funktionen noch aufgerufen werden - is nur die Frage wie sehr sich des Visual C++ and ANSI hält Das gilt aber nur für static Objekte und nicht für die auf dem Stack.
|
Doomed ACE
Addicted
|
Da sind meine 2 schlauen cents aus der Programmierecke....
<spam>
Real programmers don't comment their code! It's hard to write, and it should also be hard to read!!!
</endspam>
Alex
|
Vir@s
Code Monkey
|
Das gilt aber nur für static Objekte und nicht für die auf dem Stack. stimmt - stack wird ja "praktischer" weise nicht entleert Naja - was solls - M$ suxs - Linux rules :P
|