2008-10-28 5 views
1

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

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

+0

Я предполагаю, что вы знаете, что вам нужно сделать это в своих управляемых классах, вы правильно реализуете IDisposable и располагаете своими объектами и их ресурсами. – tvanfosson 2008-10-28 19:34:02

ответ

1

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

1

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

Существует также инструмент диагностики отладки, который имеет конкретную отчетность для Memory and Handle Leaks. Его here

1

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