Я хочу поддержать мнение о том, что подход к предварительному распределению 5 МБ является "безумным", но по другой причине: он зависит от условий гонки.Если причина исчерпания памяти находится внутри вашей программы (виртуальное адресное пространство исчерпано), другой поток может потребовать 5 Мб после того, как вы освободите его, но до того, как вы его используете.Если причиной исчерпания памяти является недостаток физических ресурсов на машине из-за того, что другие процессы используют слишком много памяти, эти другие процессы могут потребовать 5 МБ после ее освобождения (если реализация malloc возвращает пространство в систему).
Некоторые приложения, такие как проигрыватель музыки или фильмов, будут вполне оправданы, если просто завершиться сбоем при сбое распределения - они практически не обрабатывают изменяемые данные.С другой стороны, я считаю, что любое приложение, которое используется для изменения потенциально ценных данных, должно иметь способ (1) обеспечить, чтобы данные, уже находящиеся на диске, оставались в согласованном, не поврежденном состоянии, и (2) записыватькакой-то журнал восстановления, чтобы при последующих вызовах пользователь мог восстановить любые данные, потерянные при принудительном закрытии приложения.
Как мы видели в первом абзаце, из-за условий гонки вашПодход "malloc 5mb and free it" не работает.В идеале код для синхронизации данных и записи информации для восстановления должен быть полностью свободным от выделения;Если ваша программа хорошо спроектирована, она, вероятно, не требует выделения.Один из возможных подходов, если вы знаете, что на этом этапе вам потребуются выделения, - это реализовать свой собственный распределитель, работающий в небольшом статическом буфере / пуле, и использовать его во время завершения выделения при сбое распределения.