Обнаружение утечек памяти в COM-объектах с пересчетом (Addref без выпуска)

Я пишу приложение Direct3D 10 и хочу убедиться, что у меня нет утечки COM-объектов.

Да, я обертываю интерфейсы с помощью CComPtr, но я все равно хотел бы проверить утечку по той же причине, по которой я все еще использую обычный детектор утечки при выделении кучи, хотя RAII и интеллектуальные указатели гарантируют, что утечек не будет: иногда (особенно при взаимодействии в библиотеку C, такую ​​как Direct3D), вы должны вернуться к более низким уровням абстракции и использовать необработанные указатели, новые, удалять, и вы делаете ошибки. (Не говоря уже о некоторых вызовах Release() не возвращают 0 в конце программы)

Я #defined _ATL_DEBUG_INTERFACES, прежде чем я включаю atlbase.h, но ничего не появляется в окне вывода! Есть ли что-то еще, что мне нужно сделать, чтобы заставить _ATL_DEBUG_INTERFACES работать?

1 ответ

Если вы используете CComPtr, то это, как правило, главное, что я бы посоветовал, но я нашел кое-что, что могло бы помочь, если вы используете Visual Studio.

В блоге Sara Fords есть очень крутой совет:

Отладка проблем AddRef/Release в VS

Вы можете получить много зарегистрированной информации, но основная идея состоит в том, чтобы отслеживать ваши вызовы addref/release в Visual Studio, и вы можете искать несоответствующие пары AddRef/Release.

Может быть, немного работы, но это выглядит довольно хитрая идея.

Изменить 2: Доброе утро;

Хорошо, если вы не используете DllGetClassObject, это не будет ссылочной проблемой. Использование IUknowns в качестве входных / выходных параметров, тем не менее, имеет оговорку; Это реклама MSDN для AddRef:

Вызывайте этот метод для каждой новой копии указателя интерфейса, который вы делаете. Например, если вы передаете копию указателя обратно из метода, вы должны вызвать AddRef для этого указателя. Вы также должны вызвать AddRef для указателя перед передачей его в качестве входного параметра в метод; метод вызовет IUnknown::Release перед копированием выходного значения поверх него.

Аналогично для выпуска:

Вызывайте этот метод, когда вам больше не нужно использовать указатель интерфейса. Если вы пишете метод, который принимает параметр in-out, вызовите Release для указателя, который вы передаете, прежде чем копировать out-значение поверх него.

Другие вопросы по тегам