Студопедия  
Главная страница | Контакты | Случайная страница

АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатика
ИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханика
ОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторика
СоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансы
ХимияЧерчениеЭкологияЭкономикаЭлектроника

Стандартные процедуры размещения и освобождения динамической памяти

Читайте также:
  1. A) Постоянно находится в памяти.
  2. Double сохраняется в памяти 15-16 десятичных знаков.
  3. II. МЕТОДЫ, ПОДХОДЫ И ПРОЦЕДУРЫ ДИАГНОСТИКИ И ЛЕЧЕНИЯ
  4. II. МЕТОДЫ, ПОДХОДЫ И ПРОЦЕДУРЫ ДИАГНОСТИКИ И ЛЕЧЕНИЯ
  5. III. Административные процедуры
  6. III. Распределение виртуальной памяти
  7. LINUX|| Структура памяти процесса в ОС Linux.
  8. LINUX|| Управление памятью в ОС Linux. Карта памяти
  9. Remembrance Day -День памяти.
  10. Swap MACRO a,b; a,b - параметры макро (ячейки памяти)

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

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

1. С помощью стандартной процедуры New (P); где Р - переменная типа «типизированный указатель». Эта процедура создает новую динамическую переменную (выделяет под нее участок памяти) и устанавливает на нее указатель PP записывается адрес выделенного участка памяти). Размер и структура выделяемого участка памяти задается размером памяти для того типа данных, с которым связан указатель 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 | Поможем написать вашу работу | Нарушение авторских прав




lektsii.net - Лекции.Нет - 2014-2024 год. (0.009 сек.) Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав