Дизайн C API: что делать, когда malloc возвращает NULL?

Допустим, я пишу небольшую библиотеку на 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;
}

Но это кажется глупым и, возможно, опасным.)

Что такое как с этим справиться?

20
задан Ismail Badawi 29 January 2012 в 03:13
поделиться