Выделить память
#include <stdlib.h>void * malloc( size_t size );
libc
Функция malloc() выделяет буфер размером size байт. Используйте free() или realloc() для освобождения или перевыделения блока памяти.
![]() | Поскольку при адресации malloc() использует 32 -разрядные знаковые числа, нельзя выделить больше 2 ГБ за один раз. При попытке выделить больше 2 ГБ за раз, malloc() завершится с ошибкой ENOMEM . |
Если size равен нулю, по умолчанию будет возвращён не-NULL
указатель, который можно будет использовать только при вызове free() или realloc(). Этот адрес не указывает на допустимую область памяти. Если переменная окружения MALLOC_OPTIONS установлена в значение V
, malloc() в рассматриваемом случае вернёт NULL
. Эта переменная также влияет на работу функций calloc() и realloc(). Данный механизм описывает поведение “System V”.
![]() | malloc() оперирует предвыделенным регионом памяти, включающем несколько блоков.
Если отсутствует свободный блок памяти, аллокатор памяти использует mmap() для получения новых страниц из системы. Глобальная переменная _amblksiz (определена в |
Указатель на начало выделенной памяти.
Если возникла ошибка функция возвращает NULL
, код ошибки записывается в errno.
#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);}
Вы можете изменить характеристики распределителя памяти с помощью настройки следующих переменных окружения (отвечают за: кэширование памяти распределителем, момент возвращения памяти системе):
MAP_NOINIT
; если отображаемая физическая память была освобождена ранее с UNMAP_INIT_OPTIONAL
, тогда требование POSIX об обнулении памяти будет проигнорировано. Существуют и другие способы управления распределением памяти в malloc(): изменение граничного значения, по которому функция отличает малые блоки от больших (см. MALLOC_ARENA_SIZE) и определение точного размера предвыделенных блоков памяти. Обеспечивается это следующими переменными окружения:
0
. 1
. 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 дополнительно доступны:
0
. 0
. Для точной настройки поведения аллокатора памяти в отношении кэша региона необходимо устанавливать значения и 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 системной библиотеки