Читайте также:
|
|
При выполнении программы наступает момент, когда необходимо использовать динамическую память, т.е. выделить её в нужных видах, разместить там какие-то данные, поработать с ними, а после того, как в данных отпадет необходимость - освободить выделенную память.
Динамическая память может быть выделена двумя способами:
1. С помощью стандартной процедуры New (P); где Р - переменная типа «типизированный указатель». Эта процедура создает новую динамическую переменную (выделяет под нее участок памяти) и устанавливает на нее указатель P (в P записывается адрес выделенного участка памяти). Размер и структура выделяемого участка памяти задается размером памяти для того типа данных, с которым связан указатель P. Доступ к значению созданной переменной можно получить с помощью P^.
2. С помощью стандартной процедуры GetMem (P,size); где P - переменная типа «указатель» требуемого типа; size - целочисленное выражение размера запрашиваемой памяти в байтах.
Эта процедура создает новую динамическую переменную требуемого размера и свойства, а также помещает адрес этой созданной переменной в переменную Р типа «указатель». Доступ к значению созданной переменной можно получить с помощью P^.
Например:
TYPE REC =RECORD
FIELD1:STRING[30];
FIELD2:INTEGER;
END;
PTR_REC = ^ REC;
VAR P: PTR_REC;
BEGIN
GETMEM(Р,SIZEOF(REC)); {Выделение памяти, адрес выделенного участка фиксируется в Р; размер этой памяти в байтах определяет и возвращает стандартная функция SizeOf, примененная к описанному типу данных; однако, зная размеры внутреннего представления используемых полей, можно было бы подсчитать размер памяти «вручную» и записать в виде константы вместо SizeOf(Rec) }
...
{использование памяти}
...
FREEMEM(P, SIZEOF(REC)); {освобождение уже ненужной памяти}
...
Динамическая память может быть освобождена четырьмя способами.
1. Автоматически по завершении всей программы.
2. С помощью стандартной процедуры Dispose (P); где P - переменная типа «указатель» (типизированный).
В результате работы процедуры DISPOSE(P) участок памяти, связанный с указателем P, помечается как свободный для возможных дальнейших размещений. При этом физической чистки указателя P и связанной с ним памяти не происходит, поэтому, даже удалив этот экземпляр записи, можно все же получить значения ее полей, однако использовать это обстоятельство не рекомендуется. Ввиду различия в способах реализации процедуру DISPOSE не следует использовать совместно с процедурами MARK и RELEASE.
3. С помощью стандартной процедуры FreeMem (P, size); где P - переменная типа «указатель», size - целочисленное выражение размера памяти в байтах для освобождения.
Эта процедура помечает память размером, равным значению выражения SIZE, связанную с указателем P, как свободную (см. пример для GETMEM).
4. С помощью стандартных процедур Mark (P); Release (P); где P - переменная типа «указатель»;
MARK - запоминает состояние динамической области в переменной-указателе Р;
RELEASE - освобождает всю динамическую память, которая выделена процедурами NEW или GETMEM после запоминания текущего значения указателя Р процедурой MARK.
Обращения к MARK и RELEASE нельзя чередовать с обращениями к DISPOSE и FRЕЕМЕM ввиду различий в их реализации.
Например:
VAR P:POINTER;
P1, P2, P3:^INTEGER;
BEGIN
NEW(P1); P1^:=10;
MARK(P); { пометка динамической области }
NEW(P2); P2^:=25;
NEW(P3); P3^:=P2^+P1^;
WRITELN (P3^);
RELEASE(P); {память, связанная с P2 ^ и P3^, освобождена, а P1^ может использоваться}
END.
Дата добавления: 2014-12-18; просмотров: 27 | Поможем написать вашу работу | Нарушение авторских прав |