"We are back" « oc.at

Windows-Error nach Programmende

HeavySkater 13.12.2001 - 13:57 1800 19
Posts

HeavySkater

Big d00d
Avatar
Registered: Mar 2001
Location: Vienna
Posts: 257
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
Registered: Oct 2001
Location: Deutschland (Bad..
Posts: 114
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
Registered: May 2000
Location: /home/noe/
Posts: 3518
Dann schreib einfach exit(1) wenns keinen Fehler gibt, Windoof scheint das zu brauchen....

Ringding

Pilot
Avatar
Registered: Jan 2002
Location: Perchtoldsdorf/W..
Posts: 4300
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
Avatar
Registered: Mar 2000
Location: MeidLing
Posts: 11342
Irgendwo hast du Speicher überschrieben, der nicht dir gehört. Die Debug-Runtime checkt das beim Beenden.

Vir@s

Code Monkey
Registered: Nov 2000
Location: Wien
Posts: 730
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
Avatar
Registered: Mar 2000
Location: MeidLing
Posts: 11342
Zitat von Vir@s
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
Registered: Nov 2000
Location: Wien
Posts: 730
Zitat von that
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
Avatar
Registered: Mar 2000
Location: MeidLing
Posts: 11342
Zitat von Vir@s
[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
Registered: Nov 2000
Location: Wien
Posts: 730
Zitat von that
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
Avatar
Registered: Mar 2001
Location: Vienna
Posts: 257
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
Registered: Nov 2000
Location: Wien
Posts: 730
Zitat von HeavySkater
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
Avatar
Registered: Mar 2000
Location: MeidLing
Posts: 11342
Zitat von Vir@s
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
Avatar
Registered: Dec 2000
Location: Wien 23
Posts: 586
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
Registered: Nov 2000
Location: Wien
Posts: 730
Zitat von that
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
Kontakt | Unser Forum | Über overclockers.at | Impressum | Datenschutz