Zugriffsverletzung bei fclose(*FILE)
-
Moin,
Ich arbeite gerade an einem Programm, das an bestimmten Stellen immer wieder den aktuellen Status in eine Log-Datei schreibt.
Ich habe mehrere Subroutinen in denen jeweils am Anfang
FILE *stream; stream = fopen("log.out", "a");und am Ende
fclose(stream);steht. Diese ganzen Routinen werden etwa alle 10 Sekunden durchlaufen und nur ziemlich selten wird dann auch wirklich was mit fprintf(stream,"...") in die Datei geschrieben.
Das alles läuft soweit ganz gut. Nur nachdem das Programm etwas eine Stunde lief stürzt das Programm irgendwann mit einer Fehlermeldung ( Zugriffsverletzung bei .... ) ab. Das ganze passiert in der fclose() Funktion.
Irgendwelche Ideen woran das liegen könnte ?
-
Abstürze in fclose deuten (wenn der stream-Zeiger gültig und nicht NULL ist natürlich) allermeistens darauf hin dass Du Dir irgendwo anders (unter Umständen lange vorher) den Speicher kaputtgeschrieben hast.
-
Dateien in Form von FILE* gehören zu C und nicht zu C++, d.h. du bist im falschen
Sub-Forum, hier wird mit fstream, usw. gearbeitet.

-
LordJaxom schrieb:
Abstürze in fclose deuten (wenn der stream-Zeiger gültig und nicht NULL ist natürlich) allermeistens darauf hin dass Du Dir irgendwo anders (unter Umständen lange vorher) den Speicher kaputtgeschrieben hast.
Hm, und was wären so typische Beispiele wie man den Speicher kaputtschreiben kann ? Ich finde das wie gesagt ziemlich komisch, dass das Programm ne Stunde lang dasselbe macht und irgendwann ist dann wie's aussieht der Speicher hinüber.
AberHallo schrieb:
Dateien in Form von FILE* gehören zu C und nicht zu C++, d.h. du bist im falschen
Sub-Forum, hier wird mit fstream, usw. gearbeitet.

Oops

-
Buffer Overflow
char* quelle = "dreizehn byte"; char ziel[10]; strcpy (ziel, quelle);Hier wird z.B. über die Grenze von Ziel geschrieben.
Kann auch sein, dass du Speicher löschst, aber dann einen Pointer auf diesen Speicherbereich verwendest.
-
Hm, typisches Beispiel?
char text[100]; text[100] = '\0';Analog mit new, malloc, und in tausend Variationen

Tipp: Ein Memory Debugger wie valgrind (weiss ja nicht auf was für ner Plattform Du Dich bewegst) spürt sowas auf wenn es passiert, nicht erst wenn sich die Auswirkung zeigt.
-
Hm, aber ich hab doch nur fopen(), fclose() und ab und zu n fprintf() dazwischen.
-
Dein Programm muss doch sonst noch irgendetwas machen?!
if (stream) // ist aber glaube ich nicht nötig fclose (stream);
-
ja schon, aber wichtig ist doch nur das was mit "stream"(FILE*) arbeitet oder ?
Könnte es vielleicht Probleme verursachen wenn man tausendmal fopen=... und fclose() macht ohne dass dazwischen ein fprintf() steht ?
-
Kone schrieb:
ja schon, aber wichtig ist doch nur das was mit "stream"(FILE*) arbeitet oder ?
Könnte es vielleicht Probleme verursachen wenn man tausendmal fopen=... und fclose() macht ohne dass dazwischen ein fprintf() steht ?Andere Programmteile haben ebenfalls Zugriff auf den gesamten Speicherbereich und können somit bei Programmfehlern auch überall Probleme verursachen.
-
Ok, so langsam komme ich dahinter. Mit Hilfe eines Memory Debuggers hab ich jetzt rausgefunden dass es einige Speicherlecks bei mir gibt
. Ich hab mehrere male ein free(*ptr) nach einem *ptr = malloc(...) vergessen.
Ich hab jetzt den "Dauerbetrieb" noch nicht getestet, aber ich hoffe das war's.Danke für eure Geduld

-
Bei C++ benutzt man auch nicht mehr malloc und free
(es sei denn man überläd new und delete global).