2010-07-23 5 views
11

Mein Programm (ein Textmodus-Webbrowser) weist Speicher dynamisch zu.Sollte ich bei abnormaler Beendigung freien Speicherplatz freigeben?

Ich mache natürlich nicht benötigte Blöcke während der Laufzeit frei. Und ich mache alles frei vor der normalen Beendigung - so dass Speicherleckprüfer mir keine falschen Positiven geben (und flexibel sein sollten, sollten größere Refactorings jemals benötigt werden).

Nun, was ich mache nicht tun ist Speicher vor dem abnormalen Abschluss zu befreien. (Zur Zeit endet mein Programm auf Signale und nach gescheiterten mallocs/Reallocs.)

Meine Frage ist: Halten Sie diesen schlechten Stil? Soll ich bei abnormaler Kündigung freikommen?

+0

Ihr System wird Speicher zurückfordern, wenn Ihr Prozess beendet wird, nicht wahr? –

Antwort

12

Nein. Ich denke, es ist völlig in Ordnung, einfach die Hände hochzuwerfen und das OS nach Beendigung des Programms den Speicher zurückgewinnen zu lassen. Ich denke, wenn das wirklich eine abnormale Situation ist und die Absicht ist, das Programm zu beenden, dann sollte ein wohlerzogenes Programm einfach irgendwelche Disk-Ressourcen/Sperren bereinigen und so schnell wie möglich beenden.

4

Meiner Meinung nach ist es nicht notwendig, den Speicher bei einem Absturz freizugeben. Wenn Ihr Prozess beendet wird, wird OS den Speicher zurückfordern, so dass Sie alles beenden müssen. Auf der anderen Seite sollten andere Ressourcen (z.B. geöffnete Dateien) geschlossen oder zumindest geleert werden - wenn nicht, werden sie wegen der Pufferung möglicherweise unvollständig gespeichert/gespeichert.

0

Eine abnormale Beendigung Ihres Prozesses führt nicht zu Speicherblöcken, die von anderen Prozessen nicht verwendet werden können (was bedeutet, dass sie frei sind), wenn sie von ihnen zugewiesen wurden.

Wir reservieren/geben Speicher mit OS-Direktiven frei, so dass ein nicht fehlerhaftes Betriebssystem die Mem-Chunks für jeden Prozess verfolgt und sie in einen zusammenhängenden virtuellen Speicherbereich übersetzt. Bei einem Prozess-Tod signalisiert der OS Loader dies und der gesamte Speicher wird abgerufen. Dinge werden kompliziert, wenn Prozesse Speicher teilen.

Peering-Prozesse, wenn sie nicht von Ihrem Prozess abgeleitet/gestartet/gegabelt wurden (z. B. eine externe Komponente, die viele Prozesse für den Zugriff auf Multimedia-Ressourcen bereitstellt), haben Speicher (z. B. Puffer) angelegt. In Abhängigkeit von der Eigentumspolitik dieser externen Komponenten ist dieser Speicher möglicherweise nicht frei, wenn der Prozess beendet wird.

Ich rate Ihnen zu versuchen, alle Speicher vor und nach abnormalen Beendigung Szenarien begangen.

0

Nur wenn Ihr Betriebssystem Speicher beim Beenden des Programms nicht zurückfordert. DOS und sein 'Sticky Memory' ist ein Beispiel für ein solches Betriebssystem. Auf den meisten modernen Betriebssystemen ist das Nicht-Freigeben (bei abnormaler Beendigung) kein Problem.

+0

Welche Art von Speicher wird DOS beim Beenden des Programms nicht zurückgewinnen? – unbeli

+0

Hrm. Bist du sicher, dass das wahr ist? – Gian

+0

Ich bin mir sicher, dass es für mindestens eine Variante von MSDOS und CP/Ms BDOS gilt - sie hatten Unterstützung für das, was 'sticky memory' genannt wurde, auf dem ein Programm Speicherplatz reservieren konnte, und blieb auch nach dem Beenden reserviert. Auch der TSR-Aufruf in MSDOS hat etwas Ähnliches erreicht, aber ich würde es nicht als "abnormale Beendigung" betrachten. –

0

Nein, es sei denn, Ihr Programm wird immer abnormal beendet. :) Wie auch immer, das OS macht einen guten Job, es zu befreien. In der Tat machen sich viele faule Programmierer nicht einmal die Mühe, die Dinge mit normaler Beendigung zu erledigen - aber das macht es schwierig, andere Speicherlecks zu entdecken (die, die ein echtes Problem darstellen).

3

Sie brauchen nicht brauchen, um Speicher auf normalen Abschluss zurückzufordern, außer um falsche Positiven in Leckerkennungstools zu vermeiden.

Wenn Ihr Programm abnormal beendet wird, können Sie je nach Ursache freien Speicher nicht finden. Zum Beispiel bedeutet ein SIGSEGV, der aus einem beschädigten Heap resultiert, dass sogar das Versuchen, andere Sachen auf dem Haufen zu befreien, vielleicht eine hoffnungslose Übung ist.

0

Bei einer abnormalen Beendigung möchten Sie so wenig wie möglich verarbeiten. Das Minimieren des Tüftelns mit dem Abbruchprozess bedeutet, dass Sie dem Grund für den Abbruch so nahe kommen wie möglich und jede weitere Verarbeitung kann als "Verunreinigung" des Prozesses angesehen werden, was das Debuggen schwieriger macht.

Verwandte Themen