Это одна из причин того, что космические / рад жесткие системы обычно запрещают динамическое выделение памяти. Когда malloc()
терпит неудачу, чрезвычайно трудно «вылечить» неудачу. У вас есть несколько вариантов:
- Вы не обязаны использовать встроенную библиотеку libc
malloc()
(вообще, или как обычно). Вы можете обернуть malloc () , чтобы выполнить дополнительную работу при сбоях, таких как уведомление чего-либо еще. Это полезно при использовании чего-то вроде сторожевого таймера. Вы также можете использовать полноценный сборщик мусора , хотя я не рекомендую его. Лучше выявить и устранить утечки.
- В зависимости от хранилища и сложности выделенные блоки с нечастым доступом могут быть сопоставлены с диском. Но здесь, как правило, вы смотрите только на несколько КБ экономии физической памяти.
- Вы можете использовать статический пул памяти и свой собственный
malloc()
, который не будет перепродавать его. Если вы широко профилировали использование кучи (используя такой инструмент, как массив Valgrind или аналогичный), вы можете разумно определить размер пула.
Однако большинство этих предложений сводятся к тому, что система не доверяет / не использует malloc()
, если сбой не возможен.
В вашем случае, я думаю, что лучшее, что вы можете сделать, это сделать уверенный сторожевой таймер, уведомленный в случае сбоя malloc()
, чтобы ваш процесс (или вся система) мог быть -началось. Вы не хотите, чтобы он выглядел «живым и работающим» в тупике. Это может быть так же просто, как просто отсоединить файл.
Пишите очень подробные журналы. В каком файле / строке / функции произошел сбой?
Если malloc()
завершается неудачно при попытке получить всего несколько КБ, это хороший признак того, что ваш процесс действительно не может продолжаться надежно в любом случае. Если вам не удастся захватить несколько сотен МБ, вы сможете восстановить и продолжить работу. Таким образом, любое действие, которое вы предпринимаете, должно основываться только на том, сколько памяти вы пытались получить, и если вызовы для выделения гораздо меньшего размера все равно будут успешными.
Единственное, что вы никогда не захотите сделать, - это просто работать с указателями NULL и позволить ему падать. Это просто небрежно, не дает никакой полезной регистрации того, где что-то пошло не так, и создает впечатление, что ваше программное обеспечение имеет низкое / нестабильное качество.