malloc()

Выделить память

Прототип:

#include <stdlib.h>
void * malloc( size_t size );

Аргументы:

size
Размер памяти для выделения в байтах.

Библиотека:

libc

Описание:

Функция malloc() выделяет буфер размером size байт. Используйте free() или realloc() для освобождения или перевыделения блока памяти.


Caution: Поскольку при адресации malloc() использует 32-разрядные знаковые числа, нельзя выделить больше 2 ГБ за один раз. При попытке выделить больше 2 ГБ за раз, malloc() завершится с ошибкой ENOMEM.

Если size равен нулю, по умолчанию будет возвращён не-NULL указатель, который можно будет использовать только при вызове free() или realloc(). Этот адрес не указывает на допустимую область памяти. Если переменная окружения MALLOC_OPTIONS установлена в значение V, malloc() в рассматриваемом случае вернёт NULL. Эта переменная также влияет на работу функций calloc() и realloc(). Данный механизм описывает поведение “System V”.


Note: malloc() оперирует предвыделенным регионом памяти, включающем несколько блоков.

Если отсутствует свободный блок памяти, аллокатор памяти использует mmap() для получения новых страниц из системы. Глобальная переменная _amblksiz (определена в <stdlib.h>) устанавливает размер области в байтах, которая выделяется системой. Также можно использовать функцию mallopt() для контроля выделения памяти системой.


Возвращаемое значение:

Указатель на начало выделенной памяти.

Если возникла ошибка функция возвращает NULL, код ошибки записывается в errno.

Коды ошибок:

ENOMEM
Недостаточно памяти.
EOK
Успешное завершение.

Примеры:

#include <stdlib.h>
int main( void )
{
char *buffer;
buffer = (char *)malloc( 80 );
if ( buffer != NULL )
{
/* do something with the buffer */
...
free( buffer );
}
return (EXIT_SUCCESS);
}

Переменные окружения:

Вы можете изменить характеристики распределителя памяти с помощью настройки следующих переменных окружения (отвечают за: кэширование памяти распределителем, момент возвращения памяти системе):

MALLOC_ARENA_CACHE_MAXBLK
MALLOC_ARENA_CACHE_MAXSZ
MALLOC_ARENA_SIZE
MALLOC_MEMORY_HOLD
Описание переменных см. на странице mallopt().
MALLOC_FREE_LIFO
При установке malloc() меняет стратегию свободной очереди с FIFO (используется по умолчанию) на LIFO.
MALLOC_MMAP_NOZERO
Если значение ненулевое, то при необходимости увеличить регион памяти (кучу, heap) функция mmap() вызывается с флагом MAP_NOINIT; если отображаемая физическая память была освобождена ранее с UNMAP_INIT_OPTIONAL, тогда требование POSIX об обнулении памяти будет проигнорировано.

Существуют и другие способы управления распределением памяти в malloc(): изменение граничного значения, по которому функция отличает малые блоки от больших (см. MALLOC_ARENA_SIZE) и определение точного размера предвыделенных блоков памяти. Обеспечивается это следующими переменными окружения:

MALLOC_BAND_CONFIG_STR
Конфигурация групп памяти, определяемая строкой формата: N:s1,n1,p1:s2,n2,p2:s3,n3,p3: ... :sN,nN,pN, где могут присутствовать следующие компоненты:
s
Размер группы.
n
Число элементов.
p
Предвыделенное число элементов, которое может быть равно 0.
MALLOC_MEMORY_BANDCONFIG
Для установки конфигурации групп памяти необходимо задать данной переменной значение 1.
MALLOC_MEMORY_PREALLOCATE
Предварительное выделите кэша региона, значение переменной определяет общий размер кэша.
MALLOC_OPTIONS
Необходимо следить за тем, как calloc(), malloc() и realloc() ведут себя при задании size равным 0 (или задании 0 для аргумента n функции calloc()). Столбцы V (“System V”) и R (“поведение realloc() из ЗОСРВ «Нейтрино» 2011 и более ранних версий”) из таблицы ниже указывают на то, как функции ведут себя, если значение MALLOC_OPTIONS включает в себя данный символ:
Функция Значение по умолчанию V R
calloc( n, 0 ) не NULL NULL Нет имеет эффекта
malloc( 0 ) не NULL NULL Нет имеет эффекта
realloc( NULL, 0 ) не NULL NULL Нет имеет эффекта
realloc( не NULL, 0 ) не NULL NULL NULL
Во всех вышеупомянутых случаях, если функция возвращает указатель, отличный от NULL, он действителен только для соответствующего вызова free() или realloc().

Средства отладки

При использовании отладочной библиотеки libmalloc.so дополнительно доступны:

MALLOC_INITVERBOSE
Включить режим подробного информирования для вывода значений используемых переменных окружения.
MALLOC_BTDEPTH
Установка глубины трассировки для аллокаций памяти (например, где именно произошла аллокация) на CPU, где это поддерживается. В настоящее время используется builtin-функция GCC для получения адреса возвращения из malloc(). Значение по умолчанию 0.
MALLOC_TRACEBT
Установка глубины трассировки для ошибок и предупреждений. В настоящее время используется builtin-функция GCC для получения адреса возвращения из malloc(). Значение по умолчанию 0.
MALLOC_DUMP_LEAKS
Описание переменных см. на странице mallopt().
MALLOC_TRACE
Включить трассировку вызовов malloc(), free(), calloc(), realloc(), и т.д. Результаты трассировки вызовов отправляются в файл, путь которого записан в значение данной переменной окружения.

Для точной настройки поведения аллокатора памяти в отношении кэша региона необходимо устанавливать значения и MALLOC_ARENA_CACHE_MAXSZ и MALLOC_ARENA_CACHE_MAXBLK. Простой способ – установить максимальный размер кэша с помощью переменной окружения MALLOC_ARENA_CACHE_MAXSZ. Если установить только MALLOC_ARENA_CACHE_MAXBLK, поведение может быть неопределённым, поскольку размеры блоков памяти могут быть разными и, соответственно, общая память освобождённых блоков, число которых равно MALLOC_ARENA_CACHE_MAXBLK, может быть больше MALLOC_ARENA_CACHE_MAXSZ.

Классификация:

ANSI, POSIX 1003.1

Безопасность использования
Точка остановки потока
Нет
Обработчик прерываний
Нет
Обработчик сигналов
Нет
В потоке
Да

Предостережения:

Не используйте функции brk() и sbrk() с другими функциями распределителя памяти (такими как malloc(), mmap(), и free()). При использовании функции brk() предполагается, что куча непрерывна, в свою очередь в «Нейтрино» память из кучи может освобождаться не только из конца кучи – то есть она может быть разряжённой, когда участки кучи могут сменяться участками памяти, которые ранее были возвращены системе. В «Нейтрино» функция malloc() основана на функции mmap(), а не на brk().

В ЗОСРВ КПДА.00002-01, при выделении функцией malloc() 0 байт возвращается NULL. Обратите на данное обстоятельство внимание при переносе программ с ЗОСРВ КПДА.00002-01 на ЗОСРВ «Нейтрино» и обратно.

Тематические ссылки:

_amblksiz, calloc(), free(), mallopt(), mmap(), realloc(), sbrk()




Предыдущий раздел: Описание API системной библиотеки