Frage

Seit kurzem arbeite ich an einem Video-Player-Programm unter Windows für ein CCTV-Programm. Da das Programm viele Videos-Streams gleichzeitig zu entschlüsseln hat und zu spielen, ich denke, es könnte die Situation gerecht werden, dass malloc fehlschlagen und ich nach jedem malloc add überprüfen.

Aber genrally gesprochen in diesem Code von Open-Source-Programmen, die ich in Open-Source-Projekten gelesen habe, finde ich selten eine Überprüfung des Ergebnisses der malloc. Also, wenn malloc fehlschlägt, werden die meisten Programme nur zum Absturz bringen. Ist das nicht unacceptalbe?

Meine Kollegen, die Server-Programme unter Linux schreiben einen genügend Speicher für 100 Client-Verbindungen Alloc. Und obwohl sein Programm könnte den 101-Client verweigert, wird es nie einen Ausfall von malloc erfüllt. Ist sein Ansatz auch für Desktop-Anwendungen?

War es hilfreich?

Lösung

Unter Linux malloc() fehl nie - stattdessen werden die OOM Killer ausgelöst werden und beginnen zu töten Zufallsprozesse, bis das System umfällt. Da Linux der beliebteste UNIX-Derivat heute im Einsatz ist, haben viele Entwickler gelernt, einfach nie das Ergebnis malloc() überprüfen. Das ist wahrscheinlich, warum Ihre Kollegen malloc() Ausfälle ignorieren.

Auf OSes die Ausfälle unterstützen, ich habe zwei allgemeine Muster gesehen:

  • Schreiben Sie eine benutzerdefinierte Prozedur, die das Ergebnis von malloc() prüft und fordert abort() wenn Zuweisung fehlgeschlagen. Zum Beispiel können die GLib und GTK + Bibliotheken verwenden diesen Ansatz.

  • Speichern Sie eine globale Liste der „Säuberung-able“ Zuweisungen, wie Caches, die im Falle eines Zuordnungsfehler gelöscht werden kann. Dann versuchen Sie es erneut die Zuordnung, und wenn es noch nicht, melden Sie es über die Standard-Fehlermeldemechanismen (die führen keine dynamische Zuweisung).

Andere Tipps

Folgen Sie den standardisierten API

Auch unter Linux kann ulimit verwendet werden, um eine schnelle malloc Fehler Rückkehr zu erhalten. Es ist nur so, dass es standardmäßig unbegrenzt.

Es gibt einen bestimmten Druck zu veröffentlichten Standards entsprechen. Auf den meisten Systemen auf lange Sicht, und schließlich auch auf Linux, malloc(3) wird wieder ein korrekte Anzeige des Scheiterns. Es ist wahr, dass Desktop-Systeme virtuelle Speicher und Demand-Paging haben, aber auch dann nicht überprüft malloc(3) funktioniert nur in einem debugged Programm ohne Speicherlecks. Wenn etwas schief geht, wird jemand einen ulimit festlegen möchten, und es aufzuspüren. Plötzlich Sinn macht die malloc überprüfen.

das Ergebnis von malloc zu verwenden, ohne für null Überprüfung ist in Code nicht akzeptabel, die offen sein könnten auf Plattformen zu verwenden, wo malloc fehlschlagen, auf die es in Abstürzen und unvorhersehbare Verhalten führen neigen. Ich kann die Zukunft nicht vorhersehen, weiß nicht, wo mein Code gehen, so würde ich Code mit Kontrollen für malloc schreibt null Rückkehr - besser zu sterben, als verhalten unpredicatbly

Strategien für das, was malloc tun, wenn von der Art des applciation nicht abhängen und wie viel Vertrauen Sie in den Bibliotheken haben Sie verwenden. Es einige Situationen, die einzige sichere Sache zu tun, ist das ganze Programm zu stoppen.

Die Idee, eine bekannte Quote von Erinnerung an preallocating und in einigen Stücken Parzellierung, damit klar Lenkung tatsächlich die memeory anstrengend ist gut, wenn Ihre Anwendung Speichernutzung predicatable ist. Sie können dies erweitern Sie Ihre eigenen Speicherverwaltungsroutinen für die Verwendung durch Ihren Code zu schreiben.

Es hängt von der Art der Anwendung, die Sie gerade arbeiten. Wenn die Anwendung funktioniert, die in einzelne Aufgaben unterteilt ist, wo eine individuelle Aufgabe erlaubt werden kann fehlschlagen, dann die Speicherüberprüfung Zuweisungen aus anmutig zurückgewonnen werden.

Aber in vielen Fällen der einzige vernünftige Weg zu einem malloc Versagen zu reagieren, ist das Programm beendet wird. Erlauben Sie Ihren Code nur auf den unvermeidlichen null dereferenzieren abstürzen das erreichen. Es wäre sicherlich immer besser sein, einen Protokolleintrag oder eine Fehlermeldung auszug die Fehler zu erklären, aber in der realen Welt arbeiten wir auf begrenzten Zeitplan. Manchmal ist die Return on Investment von pedantischer Fehlerbehandlung gibt es nicht.

Überprüfen Sie immer, und einen Puffer vorge zuordnen, die in diesem Fall freigegeben werden kann, so dass Sie den Benutzer warnen, kann seine Daten zu speichern und die Anwendung herunterzufahren.

Abhängig von der Anwendung, die Sie schreiben. Natürlich müssen Sie immer den Rückgabewert von malloc überprüfen (). Allerdings OOM Umgang anmutig macht nur Sinn in sehr Fällen, wie Low-Level entscheidende Systemdienste, oder wenn eine Bibliothek zu schreiben, wäre sie verwendet werden könnte. eine malloc Wrapper zu haben, das auf OOM Abbrüche ist daher in vielen Anwendungen und Frameworks sehr verbreitet. Oft werden diese Wrapper namens xmalloc () oder ähnliches.

Glib des g_malloc () wird abgebrochen, auch.

Wenn Sie große Mengen an Speicher zu handhaben werden, und wollen Aussagen zu Linux machen wie „ich jetzt Speicherbereich ABC und habe ich das B Stück nicht benötigen, tun, wie Sie wollen“, haben Sie einen Blick auf mmap () / madvise () -Familie der verfügbaren Funktionen auf Lager GNU-C-Bibliothek. Je nach Ihrem Nutzungsmuster kann der Code am Ende noch einfacher als malloc. Diese API kann auch durch Speicher verschwenden Linux nicht zu helfen, verwendet werden Dateien zwischenspeichern Sie lesen wollen / schreiben nur einmal.

Sie sind in GNU libc Info Dokumentation gut dokumentiert.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top