Обнаружение утечек памяти в COM-объектах с пересчетом (Addref без выпуска) - PullRequest
4 голосов
/ 17 августа 2011

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

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

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

1 Ответ

3 голосов
/ 20 августа 2011

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

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

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

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

Возможно, это немного трудоемко, но выглядит довольно хитрой идеей.

Редактировать 2: Хорошоmorning;

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

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

Аналогично для release:

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

...