Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
программирование 2 семестр 1 курс.docx
Скачиваний:
0
Добавлен:
01.05.2025
Размер:
523.82 Кб
Скачать
  1. Выделение блока памяти из кучи

Для этого используется еще одна процедура GetMem(<параметр1>,<параметр2>);

Параметр1 –это ссылка или указатель

Параметр2-значение типа word определяющее размер выделяемого блока.

Адрес выделяемого блока будет храниться в параметре1.

Данная процедура в основном используется для работы с указателями

Пример: выделение памяти с помощью процедуры GetMem.

Var

P :pointer;

.

.

Getmem(p,sizeof(real));

Getmem(p,1024);

Реально выделенный объем будет другим.

Пример работы с блоками памяти.

Var

P:^byte;

.

.

Getmem(p,4);

P1^:=300; больше чем байт!

P^:=3; - это сработает;

  1. Процедура очистки памяти

Freemem(<параметр1>,<параметр2>)

Парметр1-ссылочная переменная или указатель.

Парметр2 –размер.

Данная процедура используется для освобождения непрерывных участков памяти. Участок памяти с адресом определённым 1 параметром и размером определенным 2 параметром после выполнения данной процедуры считается свободным. Данная процедура считается пареной процедуре Getmem и используется в основном с указателями типа Pointer.

Пример: помещение в блок динамической памяти и извлечение части графического экрана.

Uses crt;

Var

P:pointer;

Size:word;

Bedin

.

.

Size:=imagesize(x,y,x1,y1);

Getmem(p,size);

Getimage(x,y,x1,y1,p^);

Putimage(x,y,p^,1);

.

.

Freemem(p,size);

End;

  1. Процедура маркировки адреса динамической памяти.

Mark(<ссылка или указатель >);

После выполнения данной процедуры в ссылку или указатель записывается записывается адрес нижней границы свободной области памяти(значение указателя HeapPtr)

Пример 1: использование маркировки для очистки памяти.

Var

P1,p2,p3,p:^integer;

.

.

New(p1) ;

Mark(p);

New(p2);

New(p3);

Release(p);

(этот пример рассмотрен ниже).

П ример 2:

Var

Po,p1,p2,p3:^byte;

Pp:pointer;

.{1}

.

New(p0);

New(p1); {2}

New(p2);

Dispose(p1);

Mark(pp);{3}

Если далее выполнить new(p3) то выделиться блок памяти в области связанной с p1, если же p3:^integer то оператор new(p3) привел бы к тому что блок выделиться с адреса HeapPtr.

  1. Процедура освобождения памяти

Release(<ссылка или указатель>);

Продолжим пример1.

Данная процедура Release переместит указатель HeapPtr по адресу P т.е. все находящиеся выше адреса Р будет считаться свободным.

  1. Функции анализа свободной памяти в «куче»

MaxAvail- возвращает в байтах длину самого большого блока памяти. Возвращаемое значение имеет тип Longint. Данное значение необходимо учитывать для размещении в динамической памяти сплошной структуры такой как массив, записи.

MemAvail- возвращает количество всей свободной памяти в «куче» в байтах т.е. сумму длин всех свободных блоков, данная функция может использоваться при анализе ресурсов динамической памяти перед размещением в ней динамических переменных.

  1. Управление размерами динамической памяти и размером стека.

Используется глобальная директива компилятора.

{$M<размер стека>,<минимальный размер Дп>,<максимальный размер Дп>}

Размер стека изменяется в пределах от 1024-65520 байт; по умолчанию устанавливается 16 килобайт. ДП изменяется от 0 до 655360(по умолчанию).

Так как значение Дп можно указать больше чем реально допустимый объем памяти, в этом случае под динамическую память будет отведен весь доступный объем памяти .

Программа не будет выполняться если свободной памяти будет меньше чем задано минимальным значением размера. Размер стека и памяти можно установить и в интегрированной среде, а можно в программе пример {$M 1024,0,65535}