

662_____________________________________________Глава11

Функция free объявлена следующим образом:

void free(void *block) ;

Она освобождает блок памяти, выделенный ранее функциями malloc, calloc
или realloc, на который указывает block.

Рассмотрим примеры использования описанных функций. Следующий код
динамически выделяет функцией malloc память под строку, а затем, после выпол-
нения с ней каких-то операций, освобождает выделенную память.

ftinclude <stdio.h>
ftinclude <alloc.h>
char *str;

// str — указатель на строку, под которую выделена память
str = (char *) malloc(lOO);

// освобождение памяти
free(str);

В этом примере можно было бы использовать для выделения памяти функцию
calloc:

str = (char *) calloc (100, sizeof (char));

Размер выделенной функциями malloc или calloc памяти можно было бы из-
менить, например, следующим оператором:

str = (char *) reailocfstr, 20);

Впрочем, к тому же результату привел бы и более простой оператор:

realloc(str, 20);

Необходимо помнить, что рассмотренные функции возвращают NULL (0),
если память не удалось выделить. Поэтому прежде, чем использовать возвращен-
ные ими указатели, надо обязательно проверять, не равны ли они NULL. Иначе
возможно очень тяжелые ошибки при работе программы.

Теперь рассмотрим другой подход к динамическому распределению памяти:

операции new и delete.

Операция new работает аналогично функции malloc, но лучше использовать
именно ее, а не malloc. Это пожелание становится безусловной необходимостью,
если речь идет о динамическом размещении в памяти объектов библиотеки компо-
нентов C++Builder.

Операция new имеет следующий синтаксис:

<::> new <размещение> тип <(инициализатор)>
<::> new <размещение> (тип) <(инициализатор)>

Операция возвращает указатель на динамически размещенный в памяти объ-
ект.

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

Таким образом, обязательно должен быть указан только тип данных. Напри
мер:

double *A = new double;