В случае нехватки памяти при размещение динамических данных генерируется код ошибки переполнения которая является фатально прерывающей выполнение программы. В этом случае функция монитора кучи(администратора кучи) возвращает значение 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-}
Еще один способ дальнего вызова