Анализ ресурсов ДП при размещение динамических данных

В случае нехватки памяти при размещение динамических данных генерируется код ошибки переполнения которая является фатально прерывающей выполнение программы. В этом случае функция монитора кучи(администратора кучи) возвращает значение 0 Данная функция является системной функцией. Функция монитора кучи эта функция может возвращать несколько значений причем эти значения возвращаются в случае если по запросу операторов new или getmem не может быть выделен блок памяти.

Значения возвращаемые функцией:

0-фатальная ошибка которая приводит к остановки программы (возвращается по умолчанию)

1-вместо аварийного завершения программы при нехватке памяти функция возвращает в указатель или ссылку связанными с процедурами new или getmem значение Nil.

2-в этом случае ошибка заканчивается и происходит повторный запрос.

4.Функция монитора кучи обычно называется HeapFunc(); однако в нашем случае это название является не принципиальным, важным является заголовок этой функции.

Function имя(<размер выделяемого блока>:word):integer(возвращаемое значение);

Размер выделяемого блока определяет значение которое устанавливается при вызове процедуры new или getmem. Адрес функции монитора кучи находится в системной переменной HEAPerror.

Чтобы процедуры размещение динамических данных в памяти не заканчивалось фатально, необходимо перепрограммировать функции монитора кучи так чтобы вместо 0 она возвращала 1 для этого создается пользовательская функция имеющая заголовок аналогично системной функции, которая должна возвращать 1. Адрес этой функции необходимо записать в переменную HEAPerror. Пользовательская функция должна компилироваться в режиме дальнего вызова т.е. в этом случае с функцией связывается адрес, адрес сегмента и адрес смещения.

Построим пользовательскую функцию.

{$f+} устанавливается модель дальнего вызова

Function User_func(size:word):integer;

Begin

User_func:=1;

End;

{$f-}

Еще один способ дальнего вызова


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: