Переменная HeapError позволяет вам реализовать функцию обра-
ботки ошибки динамически распределяемой области памяти. Эта функ-
ция вызывается каждый раз, когда программа динамического распре-
деления памяти не может выполнить запрос на выделение памяти.
НеаpError является указателем, который ссылается на функцию со
следующим заголовком:
function HeapFunc(Size: word): integer; far;
Заметим, что директива far указывает функции обработки ошиб-
ки динамически распределяемой области не необходимость использо-
вать дальнюю модель вызова.
Функция обработки ошибки динамически распределяемой области
реализуется путем присваивания ее адреса переменной НеаpEror:
HeapError := @HeapFunc;
Функция обработки ошибки динамически распределяемой области
памяти получает управление, когда при обращении к процедурам New
или GetМем запрос не может быть выполнен. Параметр Size содержит
размер блока, для которого не оказалось области памяти соответс-
твующего размера, и функция обработки ошибки динамически распре-
деляемой области произведет попытку освобождения блока, размер
которого не меньше данного размера.
Перед вызовом функции обработки ошибки динамически распреде-
ляемой области памяти администратор динамически распределяемой
памяти пытается выделить свободный блок из блоков вторичного раз-
биения, а также использовать непосредственный вызов функции
GlobalAlloc.
В зависимости от успеха выполнения этой попытки функция об-
работки ошибки динамически распределяемой области возвращает зна-
чения 0, 1 или 2. Возвращаемое значение 0 свидетельствует о неу-
дачной попытке, что немедленно приводит к возникновению ошибки во
время выполнения программы. Возвращаемое значение 1 также свиде-
тельствует о неудачной попытке, но вместо ошибки этапа выполнения
оно приводит к тому, что процедуры New или GetМем возвращают ука-
затель nil. Наконец, возвращаемое значение 2 свидетельствует об
удачной попытке и вызывает повторную попытку выделить память (ко-
торая также может привести к вызову функции обработки ошибки ди-
намически распределяемой области).
Стандартная обработки функция ошибки динамически распределя-
емой области всегда возвращает значение 0, приводя, таким обра-
зом, к ошибке всякий раз, когда не могут быть выполнены процедуры
New или GetМем. Однако для многих прикладных задач более подходя-
щей является простая функция обработки ошибки динамически распре-
деляемой области, пример которой приведен ниже:
function HeapFunc(Size: Word): Integer; far;
begin
HeapFunc := 1;
end;
Если такая функция реализована, то вместо принудительного
завершения работы программы в ситуации, когда процедуры New или
GetМем не могут выполнить запрос, она будет возвращать пустой
указатель (указатель nil).