Я посвятил большое количество строк кода C очистке-ярлыкам/условностям для неудачного выделения памяти (обозначается семейством alloc
, возвращающим NULL
). Меня учили, что это была хорошая практика, так что при сбое памяти соответствующий флаг может быть помечен и вызывающий может потенциально выполнить "изящную очистку памяти" и повторить попытку. У меня теперь есть некоторые сомнения относительно эта философия, которую я надеюсь прояснить.
Я предполагаю, что возможно, что вызывающий может освободить избыточное пространство буфера или удалить реляционные объекты своих данных, но Я обнаружил, что вызывающий абонент редко имеет возможность (или находится на соответствующем уровне абстракции) для этого. Кроме того, раннее возвращение из вызываемой функции без побочных эффектов часто нетривиально.
Я также только что открыл убийцу Linux OOM, который, кажется, делает эти усилия совершенно бессмысленными на моей основной платформе разработки.
По умолчанию Linux следует за оптимистическая стратегия распределения памяти. Это означает, что когда malloc() возвращает не-NULL нет гарантии, что память действительно доступна. Это очень плохая ошибка. Если это оказывается, что система отсутствует памяти, один или несколько процессов будут быть убитым печально известным OOM убийца.
Я полагаю, что есть другие платформы, которые следуют тому же принципу. Есть ли что-то прагматичное, что делает проверку условий OOM стоящей?