Страница Справочника malloc.3


MALLOC(3)           Справочник библиотечных функций FreeBSD          MALLOC(3)

НАЗВАНИЕ
     malloc, calloc, realloc, free, reallocf -- основные функции выделения
     памяти

БИБЛИОТЕКА
     Стандартная библиотека C (libc, -lc)

СИНТАКСИС
     #include <stdlib.h>

     void *
     malloc(size_t size);

     void *
     calloc(size_t number, size_t size);

     void *
     realloc(void *ptr, size_t size);

     void *
     reallocf(void *ptr, size_t size);

     void
     free(void *ptr);

     char * malloc_options;

ОПИСАНИЕ
     Функция malloc() выделяет size байт системной памяти Выделенное простран-
     ство подходит (после ) для хранения объектов любого типа Если выделенное
     пространнство как минимум pagesize байт (смотри getpagesize(3)), выделен-
     ная память будет приравнена к границам страницы.  Если при вызове функции
     malloc() происходит ошибка, возвращается значение NULL

     Учтите, что malloc() НЕ заполняет выделенную память нулями.

     Функция calloc() выделяет память для number объектов, каждый из которых
     size байт размером.  Результат вызова функции такой-же как функции
     malloc() с аргументом ``number * size'', Исключение составляет лишь то,
     что выделенная память заполняется нуль символами

     Функция realloc() изменяет размер ранее выделенной памяти на которую ука-
     зывает ptr до size байт.  Содержимое памяти не изменяется в пределах
     меньшей памяти, из новой и старой Если новый размер больше, Содержимое
     вновь выделенной памяти не может быть определено.  Если запрошенная
     память не может быть выделена, возвращается NULL указтель и память, на
     которую указывает ptr оста?тся неизменной.  Если ptr это NULL, указатель,
     то результат вызова функции realloc() даст те же результаты, что и
     malloc() для указанного размера.

     Вызов функции reallocf() да?т те же результаты что и вызов функции
     realloc() , за исключением того, что она очистит память на которую ссыла-
     ется переданный указатель если запрошенный объ?м памяти не может быть
     выделен Это FreeBSD специфическая API функция разработанная для отладки
     проблем связанных с вызовом realloc() вызывающим утечки памяти в библио-
     теках.

     Функция free() Освобождает ранее выделенную память, на которую ссылается
     указатель ptr и делает е? доступной для последующего выделения функциями
     malloc() calloc() Если ptr NULL, Указатель, то не производится ни какого
     действия.

НАСТРОЙКА
     Один раз, когда одна из функций выделения памяти вызывается впервые,
     устанавливаются или сбрасываются некоторые флаги влияющие на выполнение
     приложения использующего эти функции.

     ``имя'' файла на который указывает символическая ссылка с именем
     /etc/malloc.conf, Значение переменной окружения MALLOC_OPTIONS, А так-же
     строка на которую указывает глобальная переменная malloc_options будут
     распознаны, в этом порядке, посимвольно, как набор флагов.

     Многие флаги состоят из одного символа, где верхний регистр значит, что
     опция включена, или установлена, и нижний регистр значит что опция выклю-
     чена.

     A       Все предупреждения (кроме предупреждений о нераспознанных флагах
             ) становятся смертельными(?).  В этом случае процесс вызовет
             abort(3)

     J       Каждый байт памяти выделенной функциями malloc(), realloc() или
             reallocf() так же как и значение вернувшееся от функций free(),
             realloc() или reallocf() будет заполнено байтами со значением
             0xd0.  Эта опция так-же устанавливает опцию ``R'' Этот флаг
             используется только для отладки и отрицательно сказывается на
             производительности.

     H       Отправляет ядру сообщение о страницах памяти неиспользованных
             функциями выделения памяти.  Это улучшит производительность в
             случае если система черезмерно разбивает память на страницы. По
             умолчанию эта опция отключена.

     R       Заставляет функции realloc() и reallocf() всегда выделять заново,
             даже в случае если начальный размер был достаточно большим Эта
             опция может существенно помочь уплотнению памяти.

     U       Генерировать вхождения ``utrace'' для ktrace(1), для всех опера-
             ций.  Смотрите документацию, для более полного описания.

     V       Попытка выделить 0 байт верн?т значение NULL вместо правильного
             указателя (Обычно подразумевается произведение минимального выде-
             ления и возврат указателя на него.)  Эта опция оставлена для сов-
             местимости с System V.  Эта опция не совместима с опцией ``X''

     X       Равносильно возврату ошибки при любом выове функции выделения
             памяти, выводит отладочную информацию на стандартный поток ошибок
             и заставляет приложение сделать дамп ядра (используя abort(3)).
             Эта опция должна быть установлена во время компиляции приложения
             вставкой в исходный текст программы следующих строк

                   extern char *malloc_options;
                   malloc_options = "X";

     Z       Эта опция неявно устанавливает опции ``J'' и ``R'' , и затем
             обнуляет все запрошенные байты.  Эта опция предназначена только
             для отладки и отрицательно сказывается на производительности.

     <       Уменьшить размер кэша вдвое.  По умолчанию размер кэша равен
             16-ти страницам.  Опция может быть установлена несколько раз.

     >       Удваивает размер кэша.  По умолчанию размер кэша равен 16-ти
             страницам.  Опция может быть установлена несколько раз.

     Опции ``J'' и ``Z'' предназначены для отладки.  Приложение которое меняет
     свой режим работы когда эти опции установлены является некорректным.

ПРИМЕРЫ
     Для глобального уменьшения размера кэша и дампа ядра в случае возникнове-
     ния ошибки:

           ln -s 'A<' /etc/malloc.conf

     Чтобы указать в исходном коде, что программа не делает проверку возвраща-
     емого значения при вызове этих функций

           extern char *malloc_options;
           malloc_options = "X";

ОКРУЖЕНИЕ
     Следующие переменные окружения влияют на работу функций выделения памяти:

     MALLOC_OPTIONS  Если переменная окружения MALLOC_OPTIONS установлена, то
                     символы которые она содержит будут распознаны как флаги
                     для функций выделения памяти

ВОЗВРАЩАЕМЫЕ ЗНАЧЕНИЯ
     Функции malloc() и calloc() в случае успеха возвращают указатель на выде-
     ленную память; иначе возвращается NULL указатель is returned и errno
     устанавливается равным ENOMEM.

     Функции realloc() и reallocf() в случае успеха возвращают указатель, воз-
     можно равный ptr, на выделенную память ; иначе возвращается NULL указа-
     тель, в этом случае память, на которую указывает ptr оста?тся доступной и
     неизменной.  В случае ошибки при выделении памяти, errno устанавливается
     равной ENOMEM.

     Функция free() ничего не возвращает.

ОТЛАДКА ПРОБЛЕМ ВЫДЕЛЕНИЯ ПАМЯТИ
     Основное отличие между этой реализацией и другими функциями выделения
     памяти заключается в том, что свободные страницы памяти недоступны до их
     выделения, и активно возвращаются ядру для их повторного использования.

           Многие реализации выделения памяти сохраняют данные в виде связан-
           ного списка в свободных ячейках памяти используемых для связи сво-
           бодной памяти в одно целое Это может быть не совсем оптимальным,
           так как каждый раз проходится список свободных ячеек, иначе неис-
           пользуемые страницы сбрасываются в основную памать.  На системах с
           постраничным разбиением памяти, это может увеличить впятеро количе-
           ство сбросов страницы процессом.

     Побочный эффект такой архитектуры в том, что многие незначительные нару-
     шения в интерфейсе, которые обычно не заметны, становятся заметными. В
     результате программы которые годами счастливо работали могут внезапно
     начать громко жаловаться при линковке с этой реализацией выделения
     памяти.

     Первая и самая важная вещь, это установить флаг ``A''.  Этот флаг застав-
     ляет приложение сохранять дамп ядра (если возможно) при первых признаках
     проблемы, что лучше чем попытка продолжить выполнение если это возможно.

     Так же наверное неплохая идея перекомпилироватиь программу с подходящими
     флагами, и отладочными символами.

     Если программа начинает выдавать нестандартные результаты, дамп ядра или
     просто нестандартно себя вед?т без сообщений перечисленных в следующей
     секции, то это больше всего похоже на то, что приложение требует обнуле-
     ния выделенной памяти. Попробуйте запустить его с установленной опцией
     ``Z'' ; Если это улучшило ситуацию, то этот дигноз подтвердился.  Если же
     программа вс? ещ? плохо работает, то это похоже на попытку доступа к
     памяти за пределами выделенного региона.

     Вариант, если симптомы тяжело повторить, то установка опции ``J'' может
     спровоцировать проблему.

     В действительно тяж?лых случаях опция ``U'' , если поддерживается ядром,
     может дать детальное описание всех вызовов этих функций.

     К несчастью эта реализация не предоставляет детальный отч?т обо всех
     обнаруженных ошибках, это сильно повлияет на производительность.  В
     интернете можно найти некоторые реализации этой библиотеки, предназначен-
     ные для более детальной диагностики и отладки проблем, но в ущерб произ-
     водительности.

ОТЛАДОЧНЫЕ СООБЩЕНИЯ
     Если функции malloc(), calloc(), realloc() или free() встречают ошибку,
     или предупрежление, будет написано соответствующее сообщение в файловый
     дескриптор STDERR_FILENO.  Результатом ошибки будет дамп ядра.  Если
     опция ``A'' установлена, все предупреждения будут распознаны как ошибки.

     Краткое описание сообщений об ошибке и их значение:

     (ES): mumble mumble mumble  Функции выделения памяти были скомпилированы
     с включ?нной опцией ``EXTRA_SANITY'' , И ошибка была найдена при дополни-
     тельной проверке.  Посмотрите исходный код для дополнительной информации.

     mmap(2) failed, check limits  Очень похоже, что система критично перегру-
     жена, или ограничения процесса установлены неправильно

     freelist is destroyed  Внутренний список свободной памяти поврежд?н.

     out of memory  Была установлена опция ``X'' и выделение памяти закончи-
     лось ошибкой.

     Краткое описание предупреждений и их описание:

     chunk/page is already free  Процесс пытается освободить память уже являю-
     щуюся свободной

     junk pointer, ...  Указатель инициализированный одной из функций выделе-
     ния памяти указывает за пределы памяти которая была выделена.

     malloc() has never been called  Никокго выделения памяти не проводилось,
     но что-то уже освобождается или меняет размер

     modified (chunk-/page-) pointer  Указатель переданный функции free() или
     realloc() был измен?н

     pointer to wrong page  Указатель который free(), realloc(), или
     reallocf() пытаются освободить не указывает на "правильную" память.

     recursive call  Процесс пытается рекурсивно вызвать функцию выделения
     памяти.  Это не разрешено. Более детально: обработчики сигналов не должны
     пытаться выделить память.

     unknown char in MALLOC_OPTIONS  Неизвестная опция была установлена.  Даже
     с установленной опцией ``A'' это предупреждение оста?тся всего лишь пре-
     дупреждением.

СМОТРИ ТАК ЖЕ
     brk(2), mmap(2), alloca(3), getpagesize(3), memory(3)
     /usr/share/doc/papers/malloc.ascii.gz

СТАНДАРТЫ
     malloc(), calloc(), realloc() и free() соответствуют стандарту ISO/IEC
     9899:1990 (``ISO C90'').

ИСТОРИЯ
     Существующая реализация появилась как файловая система для накопителей
     подключ?нных к 20-ти битным компьютерам построенным на основе германиевых
     транзисторов. С тех пор она изменилась для работы не только с основным,
     но и с вторичным хранилищем данных.  Впервые в сво?м современном обличие
     эта библиотека появилась в FreeBSD 2.2.

     Функция reallocf(3) Впервые появилась в FreeBSD 3.0.

АВТОРЫ
     Poul-Henning Kamp <phk@FreeBSD.org>

ОШИБКИ
     Сообщения выводимые в случае ошибки не предоставляют детальный отч?т о
     действительных значениях.

     Это может быть обоснованно тем, что возвращаемый NULL указатель при
     попытке выделить 0 байт - глупый ответ на глупый вопрос.


FreeBSD 6.2                     27 Августа 1996                    FreeBSD 6.2