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