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

StackOverflow https://stackoverflow.com/questions/244489

Вопрос

У меня есть управляемый dll, который вызывает в нативную библиотеку. Эта нативная библиотека обычно возвращает IntPtrs. Они могут быть переданы другим методам в нативной библиотеке для выполнения каких-либо действий или для указания библиотеке освободить экземпляр, связанный с IntPtr. Но только некоторые экземпляры должны быть освобождены таким образом, другие управляются библиотекой. Проблема в том, что в документации не всегда ясно, какие экземпляры должны быть освобождены, а какие нет.

Я хочу знать, есть ли способ узнать, сохранил ли мой код ссылки на какие-либо указатели, которые должны быть освобождены, и вызывает ли утечка памяти?

Это было полезно?

Решение

Самый простой способ - использовать профилировщик памяти. Быстрый Google нашел ссылку на MemProfiler . Я использовал это однажды (в качестве пробной версии), и я смог найти места, где я не мог правильно избавиться от DirectoryEntries. Я уверен, что есть и другие, включая один от RedGate.

Другие советы

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

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

Вы можете рассмотреть возможность использования SafeHandles обернуть дескрипторы, возвращенные из родного кода. Это обеспечивает некоторую дополнительную ценность по сравнению с IntPtr.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top