Освобождение памяти

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

Работа с динамической памятью

Функции для работы с динамической памятью определены в файле stdlib.h.

malloc

Функция malloc (от англ. memory allocation) запрашивает у операционной системы место в динамической памяти. Сколько байт будет запрошено, определяется её единственным аргументом типа int. Она имеет тип void* – безтиповый указатель. Этот указатель представляет собой только адрес в памяти, без указания типа данных, которые там находятся. Чтобы что-то сделать с этим указателем, его надо преобразовать в указатель на конкретный тип. Например, мы хотим создать массив c длиной в 500 элементов. Это делает следующий код:

char* c;

c=(char*)malloc(500);

В первой строке объявляется указатель на переменную типа char, который пока никуда не указывает. Во второй строке запрашивается 500 байт динамической памяти. Безтиповый указатель на первый байт этой последовательности преобразовывается в указатель типа char* и записывается в переменную c. Теперь с c можно обращаться как с обычным массивом. Массив, находящийся в динамической памяти называется динамическим массивом. В случае, если выделить память не удалось (сбой, нехватка памяти…), указатель имеет значение NULL. В реальных программах следует писать код, обрабатывающий ситуацию получения нулевого указателя.

Если мы хотим выделить место под переменные размером в несколько байт, то для этого есть оператор sizeof(<тип>). Он возвращает значение длины переменной данного типа в байтах. Например, sizeof(int)==4 в большинстве архитектур. Тогда, чтобы выделить место под массив из элементов типа int, следует написать так:

int* a;

a=(int*)malloc(500*sizeof(int));

realloc

Функция realloc (от англ. reallocation) изменяет размер участка выделенной по данному адресу памяти. Первым аргументом ей передается указатель на участок, который требуется изменить, а вторым – требуемый размер в байтах. Например:

a=(int*)realloc(a, (600*sizeof(int));

c=(char*)realloc(c, (10*sizeof(char));

Функция realloc может как увеличивать, так и уменьшать объём выделенной памяти. При увеличении объёма существующие элементы массива не изменяются, при уменьшении удаляются только последние. Если передать функции realloc указатель NULL, то она будет работать как malloc.

Функция free нужна чтобы избавиться от данного участка динамической памяти, когда он станет не нужен. Её единственным аргументом является указатель, выделенная под который память будет освобождена. Адрес, записанный в указатель, после этого станет недоступен программе, а попытка обратиться к нему приведёт к аварийному завершению работы. Поэтому сразу после использования free рекомендуется присваивать указателю значение NULL. Например:

free(a);

a=NULL;