Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
otvety_informatika_i_programmirovanie.doc
Скачиваний:
6
Добавлен:
17.09.2019
Размер:
591.87 Кб
Скачать

1. Автоматически по завершении всей программы.

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

Dispose (P);

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

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

Ввиду различия в способах реализации процедуру DISPOSE не следует использовать совместно с процедурами MARK и RELEASE.

3. С помощью стандартной процедуры 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 ввиду различий в их реализации.

Стандартные функции обработки динамической памяти.

В процессе выполнения программы может возникнуть необходимость наблюдения за состоянием динамической области. Цель такого наблюдения - оценка возможности очередного выделения динамической области требуемого размера. Для этих целей Турбо Паскаль предоставляет две функции (без параметров).

MaxAvail - Эта функция возвращает размер в байтах наибольшего свободного в данный момент участка в динамической области. По этому размеру можно судить о том, какую наибольшую динамическую память можно выделить.

MemAvail - Эта функция возвращает общее число свободных байтов динамической памяти, то есть суммируются размеры всех свободных участков и объем свободной динамической области. Тип возвращаемого значения - longint.

WRITELN( 'Доступно', MEMAVAIL, ' байтов' );

WRITELN('Наибольший свободный участок=', MAXAVAIL, 'байтов' );

Это решение основано на следующем обстоятельстве. Динамическая область размещается в специально выделяемой области, которая носит название «куча» (HEAP). Куча занимает всю или часть свободной памяти, оставшейся после загрузки программы. Размер кучи можно установить с помощью директивы компилятора М:

{$М <стек>, <минимум кучи>, <максимум кучи>}

где <стек> - специфицирует размер сегмента стека в байтах. По умолчанию размер стека 16 384 байт, а максимальный размер стека 65 538 байт;

<минимум кучи> - специфицирует минимально требуемый размер кучи в байтах; по умолчанию минимальный размер 0 байт; <максимум кучи> - специфицирует максимальное значение памяти в байтах для размещения кучи; по умолчанию оно равно 655 360 байт, что в большинстве случаев выделяет в куче всю доступную память; это значение должно быть не меньше наименьшего размера кучи.

Все значения задаются в десятичной или шестнадцатеричной формах. Например, следующие две директивы эквивалентны:

{$М 16384,0,655360}

{$M $4000, $0, $A000}

Если указанный минимальный объем памяти недоступен, то программа выполняться не будет.

Управление размещением в динамической памяти осуществляет администратор кучи, являющийся одной из управляющих программ модуля System.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]