Сравнивайте с английским: нажмите на абзац — оригинал откроется в окне. Кнопка EN под абзацем показывает его прямо в тексте.
Введение
Тип программной ошибки
Software bug type
Утечка дескрипторов – это тип программной ошибки, возникающий, когда компьютерная программа запрашивает дескриптор для ресурса, но не освобождает его, когда он больше не нужен. Если это происходит часто или неоднократно в течение длительного периода времени, большое количество дескрипторов может быть помечено как занятые и, следовательно, недоступны, что приводит к проблемам с производительностью или сбою. Термин происходит от "утечки памяти". Утечки дескрипторов, как и утечки памяти, являются конкретными случаями утечки ресурсов.
A handle leak is a type of software bug that occurs when a computer program asks for a handle to a resource but does not free the handle when it is no longer used. If this occurs frequently or repeatedly over an extended period of time, a large number of handles may be marked in use and thus unavailable, causing performance problems or a crash. The term is derived from memory leak. Handle leaks, like memory leaks, are specific instances of resource leaks.
Причины
Одна из причин утечки дескриптора – это когда программист ошибочно полагает, что получение дескриптора для сущности – это просто получение неуправляемой ссылки, не понимая, что на самом деле выполняется подсчет ссылок, копирование или другая операция. Другая причина – плохие шаблоны проектирования обработки исключений, когда программисты не учитывают, что при возникновении исключения и преждевременном выходе из подпрограммы код очистки в конце процедуры может не выполниться. Например, это может произойти при получении дескриптора устройства отображения. Программисты могут использовать этот дескриптор для проверки каких-либо свойств (например, запроса поддерживаемых разрешений), а затем просто продолжить работу, не освобождая дескриптор. Если бы дескриптор был просто указателем на структуру данных без дополнительного управления, то выход дескриптора за пределы области видимости не вызвал бы проблем. Однако во многих случаях такие дескрипторы необходимо явно закрывать или освобождать, чтобы избежать утечки ресурсов, связанных с ними; точные требования к работе с дескриптором зависят от конкретного интерфейса.
One cause of a handle leak is when a programmer mistakenly believes that retrieving a handle to an entity is simply obtaining an unmanaged reference, without understanding that a count, a copy, or other operation is actually being performed. Another occurs because of poor exception handling design patterns when programmers do not consider that when an exception occurs and a sub routine is exited prematurely, the cleanup code at the end of the routine may not be executed. An example of this might be retrieving a handle to the display device. Programmers might use this handle to check some property (e. g. querying the supported resolutions), and then simply proceed on without ever releasing the handle. If the handle was just a pointer to some data structure with no additional management, then allowing the handle to pass out of scope would not cause an issue. However, in many cases, such handles must be explicitly closed or released to avoid leaking resources associated with them; the exact requirements for what must be done with a handle varies by interface.