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

Построение динамических объектов (списков, деревьев) выполняется так же, как в языке PASCAL, т.е. для этого используются структуры. Структуры могут включать в качестве элементов указатели на себя, например, элемент односвяз-ного списка символьных строк можно описать в виде:

struct Element { char *String; struct Element *Next;};

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

void* malloc(size_t r) - возвращает указатель на место в памяти, отведенное для объекта размера r ; если память недоступна - возвращает NULL;

void* calloc(size_t n,size_t r) - возвращает указатель на место в памяти, отве­денное для массива из n объектов размера r ; если память недоступна - возвра­щает NULL;

void* realloc(void* p,size_t r) - изменяет размер объекта, на который указывает p , на r , возвращает новый указатель или NULL;

void free(void* p) - освобождает память, распределенную функциями calloc , malloc или realloc .

В С++ введены две унарные операции - new и delete - для динамического распределения памяти, освобождающие программиста от необходимости явно использовать библиотечные функции malloc, calloc и free. Операции new имя типа или new имя типа [ инициализатор ] позволяют выделить и сделать дос­тупным свободный участок памяти и возвращают адрес выделенного места. Если память недоступна - возвращают NULL. В выделенный участок заносится значе­ние, определяемое инициализатором, который не является обязательным элемен­том и представляет собой выражение в круглых скобках. Например:

point=new int(15); h=new double(3.1415); string=new char[80]; Последний оператор отводит место в свободной памяти под массив из 80 эле­ментов типа char . Указатель string содержит теперь адрес нулевого элемента массива. Для явного освобождения выделенного операцией new фрагмента па­мяти используется операция delete указатель , где указатель адресует освобож­даемый участок памяти. Например, операторами

delete point; delete string; освобождаются участки памяти, связанные с указателями point и string.