it-swarm.com.de

Soll ich vor dem Beenden Speicher freigeben?

Soll ich meinen gesamten zugewiesenen Speicher freigeben, wenn ich das Programm aufgrund eines Fehlers beende?

something = (char**) malloc (x * sizeof(char*));
for (i = 0; i < x; i++)
    something[i] = (char*) malloc (y + 1);

...

if (anything == NULL) {
   printf("Your input is wrong!");
   // should I free memory of every mallocated entity now?
   exit(1);
} 
else {
   // work with mallocated entities
   ...
   free(something); // it must be here
   system("pause);
}
16
Lucfia

Das hängt vom Betriebssystem ab. Best Practice Ich würde sagen, Sie sollten es explizit freigeben. Es macht auch die Verwendung von Tools wie valgrind zu einer PITA, wenn Sie nicht überall freien Speicher haben und ich nicht sagen kann, was gut und was schlecht ist usw.

Wenn Sie auf einem Betriebssystem, das explizit Speicher freigibt, immer noch das Problem anderer Ressourcen haben. Wenn Ihre App wächst und Bibliotheken von Drittanbietern abruft, können Ressourcenlecks auftreten. Stellen Sie sich vor, ich habe eine Bibliothek geschrieben, in der Sie gefragt werden, ob Sie einen Handler schließen möchten. Dieser Handler wird durch temporäre Dateien gesichert, die erst gelöscht werden, wenn Sie close aufrufen. Oder ich habe Prozesse getrennt, die im Hintergrund ausgeführt werden und die ich mithilfe von Signalen oder einer anderen Ressource verwalte, von der Sie nichts wissen.

4
Harry

Dies ist eine wirklich schwierige, unüberlegbare Frage.

Pro (zugunsten der Freigabe alles vor dem Beenden):

  • keine Bugs oder Speicherlecks später, wenn der Code neu angeordnet wird
  • keine Fehlalarme von Valgrind oder Memory Leak Checker
  • kein Speicherverlust, wenn Sie unter einem fehlerhaften Betriebssystem arbeiten oder überhaupt kein Betriebssystem

Con (einfach beenden, keine Sorge, alles freizugeben):

  • alles zu befreien kann eine Menge Arbeit sein
  • wenn Sie alles freigeben, kann dies zu Fehlern und Abstürzen führen
  • ihr Betriebssystem sollte wirklich, wirklich alle Ressourcen für Sie zurückfordern, wenn Sie beenden

Am Ende müssen Sie entscheiden, welches dieser Vor- und Nachteile für Sie am wichtigsten ist. Verschiedene Programmierer in verschiedenen Projekten unter verschiedenen Umständen werden unterschiedliche Schlussfolgerungen ziehen. Hier gibt es keine einheitliche Antwort.

Siehe auch Frage 7.24 in der C FAQ Liste .

12
Steve Summit

Sie müssen keinen Speicherplatz freigeben, bevor Sie das Programm beenden. Wenn Sie das Programm auf irgendeine Weise beenden, wird die Zuordnung des gesamten Speichers automatisch aufgehoben.

8
fuz

Sie sollten vor dem Beenden immer den zugewiesenen Speicher freigeben. Wie bereits in anderen Antworten erwähnt, werden Warnungen von statischen oder dynamischen Analysewerkzeugen usw. minimiert.

Der eigentliche Grund, warum Sie dies immer tun sollten, besteht darin, dass das Freigeben häufig in Ihrer Anwendung ruhende Laufzeitfehler aufdeckt.

Wenn Sie irgendwo einen Fehler haben, der eine Speicherbeschädigung verursacht oder die Zeigeradressen ändert, bleibt dieser Fehler möglicherweise stumm und inaktiv. Bis Sie etwas ändern, das nichts mit dem Fehler zu tun hat, und dadurch das Speicherlayout durchmischen. Dann kommt es plötzlich zu einem Absturz und Sie haben keine Ahnung warum, da der Fehler nicht einmal in dem Code enthalten ist, den Sie gerade hinzugefügt haben.

Indem Sie den Speicher freigeben, provozieren Sie solche Fehler. Denn wenn etwas mit dem Heap oder den Zeigern auf den Heap nicht stimmt, kommt es häufig zu einem Absturz an der Stelle, an der Sie free() aufrufen. Das bedeutet, dass Sie irgendwo einen schweren Fehler haben, den Sie finden müssen, bevor Sie das Programm versenden.

5
Lundin

Ich hatte ein völlig entgegengesetztes Szenario: Destruktoren statischer Objekte aus Bibliotheken von Drittanbietern zu entfernen. Nur weil Speicherpools vor dem Beenden explizit freigegeben werden. Ich glaube, es ist besser, vernünftig zu sein und sich auf die Programmstruktur zu konzentrieren.

0
Iurii