Ich schließe mich der Meinung an, dass der Ansatz der Vorabzuweisung von 5 MB "verrückt" ist, allerdings aus einem anderen Grund: Er unterliegt Race Conditions. Wenn die Ursache für die Erschöpfung des Speichers in Ihrem Programm liegt (der virtuelle Adressraum ist erschöpft), könnte ein anderer Thread die 5 MB beanspruchen, nachdem Sie sie freigegeben haben, aber bevor Sie sie verwenden können. Wenn die Ursache für die Erschöpfung des Speichers ein Mangel an physischen Ressourcen auf dem Rechner ist, weil andere Prozesse zu viel Speicher verwenden, könnten diese anderen Prozesse die 5 MB beanspruchen, nachdem Sie sie freigegeben haben (wenn die malloc-Implementierung den Speicherplatz an das System zurückgibt).
Einige Anwendungen, wie z. B. ein Musik- oder Filmabspielprogramm, würden bei Zuweisungsfehlern völlig zu Recht einfach beendet/abgestürzt werden - sie verwalten nur wenige oder gar keine veränderbaren Daten. Andererseits bin ich der Meinung, dass jede Anwendung, mit der potenziell wertvolle Daten verändert werden, eine Möglichkeit haben muss, (1) sicherzustellen, dass die bereits auf der Festplatte befindlichen Daten in einem konsistenten, nicht beschädigten Zustand belassen werden, und (2) eine Art Wiederherstellungsjournal zu schreiben, so dass der Benutzer bei nachfolgenden Aufrufen alle Daten wiederherstellen kann, die verloren gingen, als die Anwendung gezwungen wurde, sich zu beenden.
Wie wir im ersten Absatz gesehen haben, funktioniert Ihr Ansatz "5 MB malloc und freigeben" aufgrund von Race Conditions nicht. Idealerweise wäre der Code zur Synchronisierung von Daten und zum Schreiben von Wiederherstellungsinformationen völlig allokationsfrei; wenn Ihr Programm gut konzipiert ist, ist es wahrscheinlich von Natur aus allokationsfrei. Ein möglicher Ansatz, wenn Sie wissen, dass Sie in dieser Phase Zuweisungen benötigen, ist die Implementierung eines eigenen Allokators, der in einem kleinen statischen Puffer/Pool arbeitet, und dessen Verwendung während der Abschaltung bei Zuweisungsfehlern.