Ist es überhaupt OK, um *nicht* verwenden, free() auf zugewiesenen Speicher?

Studiere ich informatik, und ich habe einige Elektronik-Kurse. Ich hörte, von zwei meiner Professoren (diese Kurse), dass es möglich ist zu vermeiden, mit den free() - Funktion (nach malloc(), calloc() usw.) da die Speicherbereiche zugewiesen wird wahrscheinlich nicht wieder verwendet werden, zuweisen, anderen Speicher. Das heißt, zum Beispiel, wenn Sie reservieren Sie 4 bytes und dann die Freigabe, die Sie haben werden 4 Byte an Speicherplatz, die wahrscheinlich nicht noch einmal vergeben: Sie haben eine Loch.

Ich denke, dass ist verrückt: man kann nicht ein nicht-Spielzeug-Programm, wo man Speicher auf dem heap, ohne es loszulassen. Aber ich habe nicht das wissen haben, genau zu erklären, warum es so wichtig ist, dass für jede malloc() es muss eine free().

Also: gibt es überhaupt Umstände, unter denen es angebracht sein könnte, zu verwenden malloc() ohne Verwendung free()? Und wenn nicht, wie kann ich das erklären meine Professoren?

  • Ich bekomme Ihren Punkt, der Sie darauf hingewiesen werden, wenn Sie versuchen zu reservieren zusammenhängender Speicher Speicher später, es wird wahrscheinlich nicht verwenden diese Adresse, da ist es nur ein kleiner zusammenhängender block. Aber wie du und andere, stellte fest, es ist eine schlechte Praxis. Es verliert Speicher und plus, die Adresse könnte zur Verfügung, für nicht-zusammenhängenden Speicher (wie verlinkte Listen)
  • Sie sind nicht "falsch" - Sie haben eine gültige (wenn auch begrenzten) Standpunkt über die Fragmentierung von sehr kleinen isolierten freien Regionen, und wahrscheinlich erklärt es ein wenig genauer, als Sie es gemeldet.
  • Die einzige Zeit, die Sie nicht brauchen, um Speicher frei ist bei der Verwendung von verwalteten Speicher oder, wenn Sie gehen, um die Wiederverwendung der ursprünglichen zugewiesenen Speicher. Ich vermute, dass der Grund zwei Lehrer haben gesagt, dass dies, weil Sie sprechen von einem speziellen Programm, welches die Wiederverwendung der Speicher. In diesem Fall würden Sie immer noch verwenden, free (), sondern nur am Ende der Anwendung. Sind Sie sicher, dass das nicht Ihre Bedeutung?
  • Ich hatte einen professor behaupten, dass in C und C++ ist es notwendig, frei Ihre zugewiesenen Speicher in einer Funktion definiert, in der gleichen .c/.cxx-Datei, wie Sie vergeben war... Diese Leute scheinen manchmal zu stark leiden unter Hypoxie aufgrund von Wohn-zu hoch in einem Elfenbein-Turm.
  • Ich würde sagen, ein speicherreservierungsfunktion Griff Fragmentierung in den meisten der Fälle & das ist, warum Sie sollten frei Ihr Gedächtnis.
  • Es gibt durchaus ein paar nicht-Spielzeug-Programme, die keinen Speicher freigeben, und lassen Sie den OS-reinigen Sie alle bis auf Prozess beenden ist wesentlich schneller als (fussily) halten viel von Buchhaltung, so dass Sie können es selbst tun.
  • Auch "es ist möglich, vermeiden free()" ist deutlich anders als, z.B. "es macht manchmal keinen Unterschied, wenn Sie anrufen free()", sind Sie sicher, dass Ihre Professoren sagte der ehemalige?
  • Als hingewiesen durch @mfro free() nicht zurück-Speicher für das OS, aber dennoch markiert Sie für die Wiederverwendung durch malloc(). Dieses verschieben künftige Aufrufe mmap()/sbrk(), zu konservieren und system-Speicher. Mal ganze Seiten, die ungenutzt erhalten Sie ausgelagert. Prozesse mit langer Lebensdauer sollten allerdings dieses Problem anzugehen und tatsächlich zurück-Speicher für das OS (leichter bei der Verwendung von mmap() als brk(), aber es ist so viel einfacher, nur ein Neustart ein Prozess. Dies ist, wo Entwicklung und Betrieb, müssen die Zusammenhänge zu verstehen.
  • Nie Zusammenführen Sachen, die Sie hören, in Ihrem Gehirn, keine Frage. Ich hatte schon viele Lehrer und Dozenten und Korrektoren, die falsch waren oder out-of-date. Und immer analysieren, was Sie sagen sehr genau. Unser Volk ist oft sehr präzise und kann sagen, dass Zeug, das ist richtig, aber ist leicht zu verstehen, falsch oder mit der falschen Priorität von jemandem, der fühlt sich zu Hause nur im Allgemeinen Sprachgebrauch. E. g., Ich erinnere mich, in der Schule, eine Lehrerin sagte: "Hast du deine Hausaufgaben machen.", Ich sagte: "Nein.". Während ich war auf der richtigen, der Lehrer fand diese offensive, weil ich mich gerettet, die Zeit zu finden, lahme Ausreden, die er nicht erwartet hat.
  • Während die Befreiung in der selben compilation unit ist nicht erforderlich, die kostenlos wirklich sein sollte in der gleichen Bibliothek wie die Zuordnung, die möglicherweise durch die explizit herausstellen eines deallocator. Das gilt besonders für shared-libraries. Unter der Annahme, dass die "free" - von der Basis-Programm ist kompatibel mit der "malloc" in einer Bibliothek verwendet werden, ist nicht sicher. Es kann auch Ergebnis, nicht die Verwendung einer API aus einer anderen Sprache, ohne Speicherverlust, da diese Sprachen nicht haben Zugang zu den gleichen "frei".
  • Schon komisch, dass in den vergangenen zwei Jahrzehnten, die ich hatte nie irgendwelche Probleme damit, und anscheinend fast alle software, die auf linux nicht zu. Ist das vielleicht ein Mythos, der schleichende, von außergewöhnlichen fehlerhafte Implementierungen? Da der standard nicht verlangen, dass diese eine Sache, die ich nennen würde, solche Implementierungen nicht konform und gebrochen.
  • Sicher, aber shared-Bibliotheken sind noch nicht einmal berücksichtigt, indem die Sprache, die Normen, um mit zu beginnen, so ist Undefiniertes Verhalten. Ziemlich große Anwendungen, die unter windows laufen, ist oft ein Minimum von zwei verschiedenen malloc-Implementierungen, die können-müssen aber nicht-zu kooperieren. Weitere, auch unter linux Programme und shared libraries sind frei, verwenden Sie eine C-Bibliothek andere als die libc.so, wie eine statische libc, oder Alternative Implementierung. Es kann wirklich lästig/teuer zu reparieren, wenn eine Bibliothek macht diese Annahme, aber die Umgebung nicht zulässt.
  • Ich bin sicher, Sie haben das falsch verstanden, das Thema. Sie waren entweder zu sagen, Sie vermeiden mallocing/Befreiung der kleinen Speicherblöcke, oder die Wiederverwendung der Blöcke im Speicher, wenn möglich.

InformationsquelleAutor Nick | 2014-03-18
Schreibe einen Kommentar