TURBO PASCAL

Новости

Программы   

Turbo Pascal 

Игры

Документация   

Странности

FAQ

Ссылки

Форум

Гостевая книга

Рассылка

Благодарности

Об авторе

 

 

Переменная 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,  равным
        0,  не указывает на состояние ошибки,  поскольку между HeapPtr  и
        HeapEnd достаточно пространства для расширения,  однако такой вы-
        зов  служит  предупреждением,  что  неиспользуемая  область  выше
        HeapPtr сократилась,  и подсистема управления динамически распре-
        деляемой областью памяти игнорирует  значение,  возвращаемое  при
        вызове такого типа.

Содержание

На первую страницу

Rambler's Top100 Rambler's Top100
PROext: Top 1000

(с)Все права защищены

По всем интересующим вопросам прошу писать на электронный адрес

Hosted by uCoz