TURBO PASCAL |
Новости
|
Переменная 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 сократилась, и подсистема управления динамически распре- деляемой областью памяти игнорирует значение, возвращаемое при вызове такого типа. |
(с)Все права защищены По всем интересующим вопросам прошу писать на электронный адрес |