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.