Процедуры и функции | Назначение |
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.