Программирование в среде Турбо Паскаль (Поляков, Круглов) - страница 128

Таблица 11.1

Процедуры и функции

Назначение

New (VAR P : Pointer)

Отводит место для хранения динамической переменной P^ и присваивает ее адрес ссылке P

Dispose (VAR P : Pointer)

Уничтожает связь, созданную ранее New, между ссылкой P и значением, на которое она ссылалась

GetMem (VAR P : Pointer; Size : Word)

Отводит место в Size байт в куче, присваивая адрес его начала указателю (ссылке) P

FreeMem (VAR P : Pointer; Size : Word)

Освобождает Size байт в куче, начиная с адреса, записанного в указателе (ссылке) P

Mark (VAR P : Pointer)

Запоминает в указателе P текущее состояние кучи

Release (VAR P : Pointer)

Возвращает кучу в состояние, запомненное ранее в P вызовом процедуры Mark(P)

New (ТипСсылки) : Pointer

Альтернативная форма создания динамической переменной P^ типа заданного базового типа

MaxAvail : LongInt

Возвращает длину (в байтах) самого длинного свободного участка памяти в куче

MemAvail : LongInt

Возвращает сумму длин всех свободных участков памяти (в байтах)

Размещение динамических переменных.

11.5.1. Процедуры New и GetMem


Размещение динамических переменных Турбо Паскалем выполняется процедурами New( VAR P : Pointer ) и GetMem ( VAR P : Pointer; Size : Word ) или функцией New( ИмяТипаСсылки ) : Pointer и происходит следующим образом. Пусть P описана как ссылочная

- 201 -

переменная, имеющая тип IntPtr, определяющий ссылку на целое число (Integer). Тогда при вызове

New(P);

или

Р := New(IntPtr);

в куче выделяется блок памяти размером SizeOf (Integer) — это 2 байта, и адрес первого байта этого блока запишется в P. Процедура New работает только с типизированными ссылочными переменными, но значение функции New может быть присвоено переменной-указателю. После выполнения New можно уже ссылаться на динамическую переменную P^.

Процедура GetMem требует указания двух параметров. В качестве первого из них должна быть указана ссылочная переменная любого типа. Второй параметр может быть любым выражением, определяющим значение типа Word. Эта процедура производит выделение в куче неразрывного блока памяти с размером, определяемым вторым параметром процедуры (Size), и помещает адрес первого байта этого блока в ссылочную переменную (P).

Можно вызов New(P) заменить на

GetMem(P, SizeOf(ИмяБазовогоТипа_P)),

но по сути своей процедура GetMem предназначена для выделения памяти указателям:

VAR

Р : Pointer; { объявлен указатель }

BEGIN

GetMem(P, 4*1024 );

{ Теперь P указывает на блок памяти размером 4K, }

{ и P^ не имеет типа, но содержит 4096 байт. }

...

END.

Забота о подстановке размера отводимого блока памяти при работе с GetMem перекладывается на программиста так же, как и ответственность за возможную организацию «бардака» в куче при неумелом использовании процедуры GetMem.