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