Переменная HeapError позволяет вам реализовать функцию обра-
ботки ошибки динамически распределяемой области памяти. Эта функ-
B.Pascal 7 & Objects/LR - 357 -
ция вызывается каждый раз, когда программа динамического распре-
деления памяти не может выполнить запрос на выделение памяти.
НеаpЕrror является указателем, который ссылается на функцию со
следующим заголовком:
function HeapFunc(Size: Word): Integer; far;
Заметим, что директива far указывает функции обработки ошиб-
ки динамически распределяемой области не необходимость использо-
вать дальнюю модель вызова.
Функция обработки ошибки динамически распределяемой области
реализуется путем присваивания ее адреса переменной НеаpEror:
HeapError := @HeapFunc;
Функция обработки ошибки динамически распределяемой области
памяти получает управление, когда при обращении к процедурам New
или GetМем запрос не может быть выполнен. Параметр Size содержит
размер блока, для которого не оказалось области памяти соответс-
твующего размера, и функция обработки ошибки динамически распре-
деляемой области попытается освободить блок, размер которого не
меньше данного размера.
В зависимости от успеха выполнения этой попытки функция об-
работки ошибки динамически распределяемой области возвращает зна-
чения 0, 1 или 2. Возвращаемое значение 0 свидетельствует о неу-
дачной попытке, что немедленно приводит к возникновению ошибки во
время выполнения программы. Возвращаемое значение 1 также свиде-
тельствует о неудачной попытке, но вместо ошибки этапа выполнения
оно приводит к тому, что процедуры GetМем или FrееМем возвращают
указатель nil. Наконец, возвращаемое значение 2 свидетельствует
об удачной попытке и вызывает повторную попытку выделить память
(которая также может привести к вызову функции обработки ошибки
динамически распределяемой области).
Стандартная обработки функция ошибки динамически распределя-
емой области всегда возвращает значение 0, приводя, таким обра-
зом, к ошибке всякий раз, когда не могут быть выполнены процедуры
New или GetМем. Однако для многих прикладных программ более под-
ходящей является простая функция обработки ошибки динамически
распределяемой области, пример которой приведен ниже:
function HeapFunc(Size: Word): Integer; far;
begin
HeapFunc := 1;
end;
Если такая функция реализована, то вместо принудительного
завершения работы программы в ситуации, когда процедуры New или
GetМем не могут выполнить запрос, она будет возвращать пустой
указатель (указатель nil).
B.Pascal 7 & Objects/LR - 358 -
Вызов функции ошибки динамически распределяемой области па-
мяти со значением параметра Size, равным 0, показывает, что удов-
летворение запроса на выделение памяти привело к расширению дина-
мически распределяемой области памяти путем перемещения HeapPtr
вверх. Это происходит, когда в списке свободных блоков нет сво-
бодных блоков, или когда все свободные блоки слишком малы для
удовлетворения данного запроса. Вызов со значением Size, равным
0, не указывает на состояние ошибки, поскольку между HeapPtr и
HeapEnd достаточно пространства для расширения, однако такой вы-
зов служит предупреждением, что неиспользуемая область выше
HeapPtr сократилась, и подсистема управления динамически распре-
деляемой областью памяти игнорирует значение, возвращаемое при
вызове такого типа.