Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
BorlandPascal.doc
Скачиваний:
54
Добавлен:
17.03.2015
Размер:
2.83 Mб
Скачать

Переменная HeapError

Переменная HeapError позволяет вам реализовать функцию обра-

ботки ошибки динамически распределяемой области памяти. Эта функ-

ция вызывается каждый раз, когда программа динамического распре-

деления памяти не может выполнить запрос на выделение памяти.

Неа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).

Вызов функции ошибки динамически распределяемой области па-

мяти со значением параметра Size, равным 0, показывает, что удов-

летворение запроса на выделение памяти привело к расширению дина-

мически распределяемой области памяти путем перемещения HeapPtr

вверх. Это происходит, когда в списке свободных блоков нет сво-

бодных блоков, или когда все свободные блоки слишком малы для

удовлетворения данного запроса. Вызов со значением Size, равным

0, не указывает на состояние ошибки, поскольку между HeapPtr и

HeapEnd достаточно пространства для расширения, однако такой вы-

зов служит предупреждением, что неиспользуемая область выше

HeapPtr сократилась, и подсистема управления динамически распре-

деляемой областью памяти игнорирует значение, возвращаемое при

вызове такого типа.

Соседние файлы в предмете Программирование на Pascal