Скажем, я пишу небольшую библиотеку в C - какую-то структуру данных, скажем. Что делать, если я не могу выделить память?
Это может быть очень важно, например. Мне нужна память для инициализации структуры данных в первую очередь, или я вставляю пару "ключ-значение" и хочу обернуть ее в маленькую структуру. Это также может быть менее критичным, например, что-то вроде функции pretty_print
, которая создает хорошее строковое представление содержимого. Тем не менее, он, как правило, более серьезный, чем ваша средняя ошибка - не может быть смысла продолжать вообще. Тонна выборки использует malloc
в режиме онлайн прямо перед тем, как выйти из программы, если она возвращает NULL
. Я предполагаю, что много реальных клиентских кодов тоже делает это - просто выскочите какую-либо ошибку или напишите ее на stderr
и прервите. (И много реального кода, вероятно, вообще не проверяет возвращаемое значение malloc
.)
Иногда имеет смысл возвращать NULL
, но не всегда. Коды ошибок (или просто некоторые значения boolean success
), либо как возвращаемые значения, либо параметры вывода работают нормально, но похоже, что они могут загромождать или ухудшать читаемость API (опять же, возможно, это несколько ожидалось на языке, таком как C?). Другой вариант - иметь какое-то внутреннее состояние ошибки, которое вызывающий может впоследствии запросить, например. с функцией get_error
, но тогда вы должны быть осторожны в безопасности потоков, и это может быть легко пропустить; люди склонны быть слабыми в проверке ошибок в любом случае, и если это отдельная функция вообще, они могут не знать об этом, или они могут не беспокоиться (но тогда я предполагаю, что их проблема).
(Я иногда видел malloc
, завернутый в функцию, которая просто пытается снова, пока память не будет доступна...
void *my_malloc(size_t size)
{
void *result = NULL;
while (result == NULL)
result = malloc(size);
return result;
}
Но это кажется глупым и, может быть, опасным.)
Какой правильный способ справиться с этим?