Что может вызвать утечку из секции? - PullRequest
8 голосов
/ 21 октября 2011

Это дополнительный вопрос к моему предыдущему вопросу.

Как предлагалось в этом ответе на мой предыдущий вопрос , я использовал ProcessExplorer для анализа списка дескрипторов, которые мое приложение использует для обнаружения утечки дескрипторов.

Дефекты дескрипторов имеют тип Section .

Что такое дескриптор раздела, где он используется и что может вызвать утечку дескрипторов раздела?

Я не использую файлы с отображением в памяти в своем коде.

Ответы [ 4 ]

4 голосов
/ 21 октября 2011

Цитирование Марка Руссиновича из Windows 2000 (что теперь называется Windows Internals),

объект раздела , который подсистема Win32 вызывает объект отображения файла , представляет собой блок памяти, который могут совместно использовать два или более процессов.

Итак, это файл с отображенной памятью.Они бы пропали, если бы вы создали файл с отображенной памятью и не смогли закрыть его.Довольно сложно быть более конкретным.

3 голосов
/ 28 ноября 2011

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

CreateToolhelp32Snapshot

, которая возвращает дескриптор, который не был закрыт должным образом.Я не уверен, почему это приводит к утечке ручки секции.

2 голосов
/ 21 октября 2011

Файл сопоставления памяти, не связанный с дескриптором файла, может использоваться для IPC (связь между процессами).Если вы не используете их напрямую, возможно, один из вашего устройства или компонента выполняет какую-либо связь IPC.Весьма вероятно, что вы используете компонент для подключения к другому процессу и не выпускаете его в соответствии с запросом.

Первое действие, которое необходимо предпринять, - это отследить любую утечку памяти (с использованием режима отладки FastMM4), и вы наверняка найдете в своем коде несколько невыпущенных объектов.

Поскольку дескрипторы обычно выделяются объектами, из моего эксперимента устранение всех утечек памяти разрешит утечки дескрипторов.

Если у вас нет утечки памяти, есть некоторые CreateFileMapping()звонки для проверки на наличие CloseHandle() во всем вашем исходном коде (включая сторонний источник).

1 голос
/ 26 февраля 2014

Утечка дескриптора раздела в .net происходит из-за исправления Microsoft KB2670838.Удалите это обновление, и проблема утечки дескриптора раздела (нехватка памяти) будет исправлена.

Parameter is not valid. at System.Drawing.Image.get_Width()
at System.Drawing.Image.get_Size()
...