2016-07-11 9 views
1

Ich möchte ein sicheres Programm schreiben, daher werde ich erforderlichen Speicherplatz in Heap zu Beginn des Programms zuweisen.Kann ich Fehler im Arbeitsspeicher feststellen?

  1. Ist es möglich, von einem gewissen Punkt Zuweisung deaktivieren Heap-Speicher starten, wie toggle_panic_on_heap_allocation?
  2. Wie kann ich "out of memory" Fehler während der Initialisierung abfangen? Standardverhalten ist abbrechen, aber ich möchte nicht abstürzen, nur mit Fehlercode beenden?
+1

hinzuzufügen Was ist der Unterschied in Panicking (was beendet und gibt einen Fehlercode zurück) und "nur mit Fehlercode beenden"? Beachten Sie, dass OOM eine ** panic ** (ein kontrollierter und geordneter Ausgang) auslösen sollte, nicht ** crash ** (zwangsweise vom Betriebssystem beendet, um etwas Schlechtes zu tun). Beachten Sie, dass der OS OOM-Killer außerhalb Ihrer Kontrolle liegt. – Shepmaster

+0

@Shempmaster At jetzt auf oom Programm (mit Rost-1.10) druckt "fataler Laufzeitfehler: nicht genügend Arbeitsspeicher \ nUngültige Anweisung" und Core Dump wurde erstellt – fghj

Antwort

3

Nein, Sie können keine Speicherfehler feststellen.

Es gibt some discussion über das Hinzufügen (teilweise) Unterstützung, aber es gibt viele viele Probleme mit dem Abfangen von OOM-Fehlern. Sie können stattdessen einen neuen Prozess starten und über ipc-channels mit ihm kommunizieren. Der möglicherweise übergeordnete Verarbeitungsprozess wird dann einfach beendet und der andere Prozess kann sich davon erholen und den fehlgeschlagenen Prozess erneut starten.


Sie können nicht Heapzuweisungen zur Laufzeit deaktivieren, aber das ist nicht sehr interessant sowieso, da Ihr Programm würde abbrechen müssen, wenn Sie zuweisen Haufen. Stattdessen sollten Sie statisch nach keinen Heap-Zuordnungen suchen. Es gibt etwas Arbeit/Gespräch in clippy, um solch eine statische Analyse als "restriction"

+0

Was ist mit benutzerdefinierten Speicherzuordner? Zum Beispiel rufe ich 'malloc' an und überprüfe das Ergebnis, danach gebe ich dem Zuweiser zugewiesenen Speicher und verteilt ihn um' struct's und 'trait's? – fghj

+1

@ user1034749: Wenn Sie einen benutzerdefinierten Zuordner haben, dann ist es ja möglich. Achten Sie darauf, dass eine Reihe von Standardcontainern usw. "hinter Ihrem Rücken" zuordnet, damit die Panik ausgelöst wird. –

Verwandte Themen