Рассмотрим не большой пример по работе с динамической памятью.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
var p_int1, p_int2 : ^integer; p_real : ^real; i : integer; BEGIN i:=7; New(p_int1); {выделение памяти под переменные} New(p_int2); New(p_real); p_int1^:=48; {переменным типа integer присвоить значение} p_int2^:=3; p_real^:=2.732; {переменной типа real присвоить значение} p_int2^:=i; i:=p_int1^; {i=48} Dispose(p_int1); {освобождение памяти, занимаемой} Dispose(p_int2); {переменными} Dispose(p_real); END. |
В разделе описаний этой программы объявляются три указателя: p_int1 и p_int2, которые будут указывать на ячейки памяти, содержащие значения типа integer, и p_real, указывающий на значение типа real.
Прежде всего, нужно выделить в динамической памяти место под переменные, на которые ссылаются указатели. Поэтому сначала для каждого из указателей вызывается процедура New.
Теперь с выделенными участками памяти можно работать как с обычными переменными, имена которых состоят из имени соответствующего указателя и знака ^.
После выполнения всех необходимых действий с динамическими переменными, нужно освободить выделенные участки памяти: в конце программы для каждого указателя вызывается процедура Dispose.
Для выделения и освобождения динамической памяти используются также процедуры:
GetMem(P,Size) – выделяет память размером Size под переменную P;
FreeMem(P,Size) – освобождает память размером Size, занятую переменной P.
Эти процедуры используются аналогично процедурам New и Dispose. Но запомните, что освобождать нужно ровно столько памяти, сколько ранее было выделено.