Для выделения участка в кучи предназначена процедура new:
New(Имя указателя);
Имя указателя = new (имя типа указателя);
Параметром в процедуре выступает типизированный указатель. В результате обращения указатель будет содержать адрес начала выделенной области. Размер выделяемого участка памяти определяется по типу указателю.
За одно обращение к процедуре выделения памяти можно выделить не более 65 521 байт динамической памяти. Если нет свободного места в куче, то возникает ошибка выполнения программы.
Например.
Var p1, p2 : ^Integer;
P1 = new(Integer);
New (P2);
Чтобы проверить была ли выделена память, можно пойти 2 путями:
ü перед выделением памяти указателю задать значение nil;
ü перед выделением памяти проверить размер свободной части кучи с помощью функции maxavail (возвращает размер в байтах общего свободного пространства кучи).
Например: с использованием nil.
Type
TArr = array[1..100] of real;
TPArr =^TArr;
Var
p : TPArr;
Begin
p := nil;
p := new (TPArr);
if (p<>nil) then
Begin
{память выделена – можно выполнять обработку массива}
End
Else
Begin
{память не выделена – вывести соответствующее сообщение}
end;
...
End.
Например: с использованием maxavail.
Type
TArr = array[1..100] of real;
TPArr =^TArr;
Var
p : TPArr;
Begin
p := nil;
if(maxavail >= sizeof(TPArr)) then
Begin
p := new(TPArr);
{память выделена – можно выполнять обработку массива}
End
Else
Begin
{память не выделена – вывести соответствующее сообщение}
end;
...
End.
Для работы с нетипизированными указателями используется процедура GetMem:
GetMem(нетипизированный указатель, размер выделяемого участка);