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.