Посмотрите на другую сторону вопроса: если у вас malloc-память, она выходит из строя, и вы не обнаруживаете ее в malloc, когда обнаружит вы обнаружите ее?
Очевидно, что при попытке разыменовать указатель.
Как вы это обнаружите? Получив Bus error
или что-то подобное, где-нибудь после malloc, что вам придется отследить дамп ядра и отладчик.
С другой стороны, вы можете написать
#define OOM 42 /* just some number */
/* ... */
if((ptr=malloc(size))==NULL){
/* a well-behaved fprintf should NOT malloc, so it can be used
* in this sort of context
*/
fprintf(stderr,"OOM at %s: %s\n", __FILE__, __LINE__);
exit(OOM);
}
и получите «OOM at parser.c: 447».
Вы выбираете.
Обновление
Хороший вопрос о грациозном возвращении. Трудность с гарантированным изящным возвратом состоит в том, что в общем случае вы действительно не можете настроить парадигму или шаблон того, как вы это делаете, особенно в C, который, в конце концов, является необычным языком ассемблера. В среде сбора мусора вы можете принудительно выполнить сборку мусора; на языке с исключениями вы можете выбросить исключение и раскрутить вещи. В C вы должны сделать это самостоятельно, и поэтому вы должны решить, сколько усилий вы хотите приложить к этому.
В большинстве программ аварийное завершение - это лучшее, что вы можете сделать. В этой схеме (мы надеемся) вы получите полезное сообщение о stderr - конечно, это также может быть логгер или что-то в этом роде - и известное значение в качестве кода возврата.
Высокие программы обеспечения надежности с коротким временем восстановления подталкивают вас к чему-то вроде блоков восстановления , где вы пишете код, который пытается вернуть систему в выживаемое состояние. Это здорово, но сложно; газета, на которую я ссылаюсь, подробно рассказывает о них.
В середине вы можете придумать более сложную схему управления памятью, скажем, управление собственным пулом динамической памяти - в конце концов, если кто-то другой может писать malloc, то вы тоже можете.
Но просто нет общего шаблона (о котором я все равно знаю) для очистки достаточно , чтобы иметь возможность надежно вернуться и позволить программе продолжаться.