Ich entwickle eine Anwendung für ein Embedded System mit begrenztem Speicher (Tegra 2) in C ++. Ich behandle NULL-Ergebnisse von new
und new[]
im gesamten Code, der manchmal auftritt, aber die Anwendung kann damit umgehen.
Das Problem ist, dass das System den Prozess durch SIGKILL beendet, wenn der Speicher vollständig ausgelaufen ist. Kann ich irgendwie sagen, dass new
nur NULL zurückgeben sollte anstatt den Prozess zu beenden?
Ich bin mir nicht sicher, welche Art von Betriebssystem Sie verwenden, aber Sie sollten überprüfen, ob Es unterstützt opportunistic memory allocation wie Linux.
Wenn es aktiviert ist, kann Folgendes passieren:
new
oder malloc
erhält eine gültige Adresse vom Kernel. Auch wenn nicht genügend Speicher vorhanden ist , weil ... Lösung: Deaktivieren Sie das Überschreiben von Speicher:
echo 2 > /proc/sys/vm/overcommit_memory
Zwei Ideen kommen mir in den Sinn.
1.) Schreiben Sie Ihre eigene Speicherzuweisungsfunktion, anstatt direkt von new
abhängig zu sein. Sie haben erwähnt, dass Sie sich auf einem Embedded-System befinden, in dem spezielle Allokatoren in Anwendungen häufig vorkommen. Laufen Sie Ihre Anwendung direkt auf der Hardware oder laufen Sie in einem Prozess unter einer Executive / OS-Schicht? Wenn letzteres vorhanden ist, gibt es eine System-API zur Speicherzuweisung?
2.) Überprüfen Sie C ++ set_new_handler
und sehen Sie, ob es Ihnen helfen kann. Sie können anfordern, dass eine spezielle Funktion aufgerufen wird, wenn eine new
-Zuordnung fehlschlägt. Vielleicht können Sie in dieser Funktion Maßnahmen ergreifen, um zu verhindern, dass alles, was den Prozess umbringt, ausgeführt wird. Referenz: Ссылка
Tags und Links c++ memory-management sigkill