Утечка ресурсов и защита от нее
Учебные материалы


Утечка ресурсов и защита от нее



Карта сайта stopkasamogona.ru

Представьте ситуацию: подпрограмма распределяет некоторый ресурс, но исключительная ситуация прерывает ее выполнение, и ресурс остается не освобожденным. Даже подумать страшно, к чему может привести такая ошибка: утечка памяти, файловых дескрипторов, других ресурсов операционной системы. Следовательно, ресурсы нуждаются в защите от исключительных ситуаций. Для этого в среде Delphi предусмотрен еще один вариант защищенного блока:

// запрос ресурса try // защищаемые операторы, которые используют ресурс finally // освобождение ресурса end;

Особенность этого блока состоит в том, что секция

finally

...

end

выполняется всегда независимо от того, происходит исключительная ситуация или нет. Если какой-либо оператор секции

try

...

finally

генерирует исключительную ситуацию, то сначала выполняется секция

finally

...

end

, называемая секцией завершения (освобождения ресурсов), а затем управление передается внешнему защищенному блоку. Если все защищаемые операторы выполняются без ошибок, то секция завершения тоже работает, но управление передается следующему за ней оператору. Обратите внимание, что секция

finally

...

end

не обрабатывает исключительную ситуацию, в ней нет ни средств ее обнаружения, ни средств доступа к объекту исключительной ситуации.


Рисунок 4.2. Логика работы оператора try…exсept…end

Блок

try

...

finally

...

end

обладает еще одной важной особенностью. Если он помещен в цикл, то вызов из защищенного блока процедуры Break с целью преждевременного выхода из цикла или процедуры Сontinue с целью перехода на следующую итерацию цикла сначала обеспечивает выполнение секции

finally

...

end

, а затем уже выполняется соответствующий переход. Это утверждение справедливо также и для процедуры Exit (выход из подпрограммы).

Как показывает практика, подпрограммы часто распределяют сразу несколько ресурсов и используют их вместе. В таких случаях применяются вложенные блоки

try

...

finally

...

end

:

// распределение первого ресурса try ... // распределение второго ресурса try // использование обоих ресурсов finally // освобождение второго ресурса end; ... finally // освобождение первого ресурса end;

Кроме того, вы успешно можете комбинировать блоки

try

...

finally

...

end

и

try

...

exсept

...

end

для защиты ресурсов и обработки исключительных ситуаций.



edu 2018 год. Все права принадлежат их авторам! Главная