Операционная система ЗОСРВ «Нейтрино» > Руководство разработчика > Программные интерфейсы общего назначения > Системные библиотеки > Системные библиотеки > Системная библиотека > M > malloc()



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().

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

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 системной библиотеки