Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
информатика ЗКМЗКЕ_1курс / Основы алг-ции и прог-ие.doc
Скачиваний:
81
Добавлен:
05.06.2015
Размер:
1.88 Mб
Скачать
    1. Стандартные процедуры размещения и освобождения динамической памяти.

При выполнении программы наступает момент, когда необходимо использовать динамическую память, т.е. выделить её в нужных видах, разместить там какие-то данные, поработать с ними, а после того, как в данных отпадет необходимость - освободить выделенную память.

Динамическая память может быть выделена двумя способами:

1. С помощью стандартной процедуры New:

New (P);

где р- переменная типа «типизированный указатель».

Эта процедура создает новую динамическую переменную (выделяет под нее участок памяти) и устанавливает на нее указатель PPзаписывается адрес выделенного участка памяти). Размер и структура выделяемого участка памяти задается размером памяти для того типа данных, с которым связан указательP. Доступ к значению созданной переменной можно получить с помощьюP^.

2. С помощью стандартной процедуры GetMem.

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.

Dispose (P);

где P- переменная типа «указатель» (типизированный).

В результате работы процедуры Dispose(P)участок памяти, связанный с указателемP, помечается как свободный для возможных дальнейших размещений. При этом физической чистки указателяPи связанной с ними памяти нe происходит, поэтому, даже удалив этот экземпляр записи, можно все же получить значения ее полей, однакоиспользовать это обстоятельство не рекомендуется.

Ввиду различия в способах реализации процедуру Dispose не следует использовать совместно с процедурами Mark и Release.

  1. С помощью стандартной процедуры FRееМеm.

FreeMem (P, size);

где P- переменная типа «указатель»,

size- целочисленное выражение размера памяти в байтах для освобождения.

Эта процедура помечает память размером, равным значению выражения size, связанную с указателемP, как свободную (см. пример дляGetMem).

4. С помощью стандартных процедур МаrkиRelease.

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.