Для освобождения динамически выделенной памяти с помощью указателя можно использовать процедуру dispose:
Dispose(Имя указателя);
Процедура dispose не изменяет значение указателя, а просто освобождает тот участок динамической памяти, на которую указатель указывал.
После выполнения операции dispose указатель становиться неопределенным, и дальнейшее его использование для получения и задания значения области памяти приведет к ошибкам.
Также нельзя применять процедуру dispose для неопределенного указателя.
Для освобождения памяти с помощью нетипизированного указателя используется процедура FreeMem:
FreeMem(нетипизированный указатель, размер очищаемого участка);
Пример 1.
program simple;
Type
TPoint3D = record
x,y,z : real;
end;
TP = ^TPoint3D;
Var
a : TP;
Begin
new(a);
a^.x := 1;
a^.y := 2;
a^.z := 5;
dispose(a);
End.
Пример 2.Реализация динамического массива
Для написания программы необходимо использовать функции:
ü Sizeof(Х) – возвращает длину в байтах внутреннего представления переменной, функции или типа данных.
ü Ptr(seg,ofs) : Pointer – возвращает значение указателя по указанным сегменту и смещению;
ü Seg(Х) – возвращает сегментную часть адреса Х;
ü Ofs(Х) – возвращает смещение адреса Х;
ü Randomize – инициализирует датчик случайных чисел;
ü Random(X) – возвращает случайное значение в диапазоне от 0 до Х-1.
program dinmas;
uses crt;
Var
Mas : Pointer;
n : Integer;
function CreateMas(var A : Pointer; size: integer):boolean;
Begin
if (maxavail >= sizeof(Byte)*size) then
Begin
GetMem(A,sizeof(Byte)*size);
CreateMas := True;
End
else CreateMas := False;
end;
procedure Vvod(A : Pointer; size : integer);
Var
i : integer;
v : byte;
P : ^byte;
Begin
for i:=1 to size do
Begin
v := random(256);
p := ptr(seg(A), ofs(A)+sizeof(byte)*i);
p^ := v;
end;
end;
procedure Print(A : Pointer; size : integer);
Var
i : integer;
v : byte;
P : ^byte;
Begin
for i:=1 to size do
Begin
p := ptr(seg(A), ofs(A)+sizeof(byte)*i);
v := p^;
write(v:5);
end;
end;
Begin
clrscr;
randomize;
writeln('Введите количество элементов в массиве =>');