Справочные данные по языку C++_____________________________661

тратится время на выполнение функции strstr для строк, в которых искать фраг-
мент не нужно.

11.9 Динамическое распределение памяти

Динамическое распределение памяти широко используется для экономии вы-
числительных ресурсов. Те переменные или объекты, которые становятся ненуж-
ными, уничтожаются, а освобожденное место используется для новых переменных
или объектов. Это особенно эффективно в задачах, в которых число необходимых
объектов зависит от обрабатываемых данных или от действий пользователя, т.е.
заранее не известно. В этих ситуациях остается только два выхода: заранее с запа-
сом отвести место под множество объектов или использовать динамическое распре-
деление памяти, создавая новые объекты по мере надобности. Первый путь, конеч-
но, неудовлетворительный, поскольку связан с излишними затратами памяти и в
то же время накладывает на размерность задачи необоснованные ограничения.

Для динамического распределения выделяется специальная область памя-
ти — heap. Динамическое распределение памяти в этой области может производи-
ться несколькими способами: с помощью библиотечных функций malloc, calloc,
realloc, free или с помощью операций new и delete.

Указанные функции объявлены в файле stdlib.h или alloc.h. Объявление фун-
кции malloc следующее:

void *malloc(size t size);

Функция выделяет в heap блок размером в size байтов. В случае успешного
выделения памяти функция возвращает указатель на выделенный блок. Если не
хватило места для блока требуемого размера или если size = 0, возвращается
NULL.

Другая функция — calloc объявлена следующим образом:

void *calloc(size t nitems, size t size);

Функция выделяет память под nitems объектов, размер каждого из которых
равен size. Таким образом общий объем выделяемой памяти составляет nitems *
size. Выделенная память инициализируется нулями. В случае успешного выделе-
ния памяти функция возвращает указатель на выделенный блок. Если не хватило
места для блока требуемого размера или если size = 0 или nitems = 0, возвращает-
ся NULL.

Еще одна функция — realloc позволяет изменить размер ранее выделенного
блока памяти. Функция объявлена следующим образом:

void *realloc(void *block, size t size);

Она изменяет размер блока в heap, на который указывает block, до размера
size. При этом предполагается, что block указывает блок памяти, выделенной ра-
нее функциями malloc, calloc или realloc. Если же аргумент block задан равным
NULL, то функция realloc работает так же, как описанная выше функция malloc.

Если размер size задан равным нулю, то выделенный ранее блок, на который
указывает block, освобождается, а функция возвращает NULL. Таким образом,
функция с size равным 0 может использоваться не для выделения памяти, а для
освобождения памяти, выделенной ранее.

Если блок нового размера не может быть выделен, то функция realloc возвра-
щает NULL. Если же память выделилась успешно, то возвращается адрес выделен-
ного блока. При этом он может отличаться от начального значения block, посколь-
. ку функция при необходимости осуществляет копирование содержимого блока в
е   J новое место.

I