Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ТЕКСТЫ для лабработы 2 / вариант №31.rtf
Скачиваний:
21
Добавлен:
14.03.2016
Размер:
308.79 Кб
Скачать

7 Байт памяти (использование который маловероятно), которые будут

только фрагментировать динамически распределяемую область.

Переменная HeapError

─────────────────────────────────────────────────────────────────

Переменная 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, равным

Соседние файлы в папке ТЕКСТЫ для лабработы 2