Выделить память
#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 системной библиотеки