Руководство по языку B.Pascal 7


              

Переменная HeapError


Переменная 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).



Содержание  Назад  Вперед