Как я могу сказать, если я пропускаю COM-объекты? - PullRequest
6 голосов
/ 20 апреля 2011

Я пишу некоторый код, который делает (относительно простым) использование COM, вызывая AddRef () для некоторых объектов и освобождая их () позже.Кроме простой проверки кода, есть ли способ проверить, не пропускаю ли я COM-объекты везде?

(я не могу использовать подсчет ссылок IBlahBlahPtr s, потому что мне нужно пройтиобъекты к набору API, которые не знают, что такое COM, и поэтому не понимают всего «указатели подсчета ссылок» - они передают указатель как токен.)

Спасибо!

Ответы [ 4 ]

1 голос
/ 20 апреля 2011

Он ничем не отличается от проверки на утечки в любом коде C или C ++.Используйте <crtdbg.h> для обнаружения утечек, статья библиотеки MSDN здесь .Вы получите отчет об утечке для фабрики классов, если было недостаточно вызовов IUnknown :: Release ().

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

0 голосов
/ 20 апреля 2011

Различные инструменты будут проверять вас. BoundsChecker делает. Я думаю, но не уверен на 100%, что AppVerifier делает (он имеет дополнительное преимущество в том, что он бесплатный).

0 голосов
/ 20 апреля 2011

Исходя из нашего разговора в комментариях, я бы сказал, что вы можете сделать следующее:

  • Использовать умные указатели (т. Е. IBlahBlahPtr) для создания и управления COM-объектами в вашем собственном коде.
  • Поддерживайте коллекцию интеллектуальных указателей, представляющих ссылки вашего абонента на указатели, которые вы передали вверх.Каждый раз, когда вы передаете новый указатель COM своему вызывающему абоненту, помещайте его умный указатель в коллекцию.
  • Если ваш вызывающий объект каким-то образом отказывается от указателя COM (например, передав вам маркер указателя COM в каком-то виде«release»), затем найдите его умный указатель в коллекции и удалите его.Если этот умный указатель (представляющий ныне несуществующую ссылку вызывающего объекта на объект) является единственным оставшимся держателем счетчика ссылок на объекте, то уничтожение произойдет по желанию.
  • Если вызывающий абонент передает вам указатель COMне освобождая способ, вы можете обернуть новый объект умного указателя вокруг необработанного значения указателя на время вызова, просто чтобы ваше использование умных указателей в вашем собственном коде было согласованным.Разумные указатели могут ссылаться на один и тот же COM-объект.
0 голосов
/ 20 апреля 2011

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...