MSDN.WhiteKnight - Stack Overflow answers
Ответ на "Есть ли утечка памяти при вызове CComPtr и QueryInterface?"
Answer 1289010
Базовым классом для CComPtr у меня в VS2017 является CComPtrBase. Вот его конструкторы (из atlcomcli.h):
CComPtrBase() throw() { p = NULL; } CComPtrBase(_Inout_opt_ T* lp) throw() { p = lp; if (p != NULL) p->AddRef(); }
Как видно, здесь есть вызов AddRef, но только в конструкторе с параметром. Этот конструктор вызывался бы в коде вида
ATL::CComPtr<IAddress> addr(somePointer);
. В вашем случае же вызывается конструктор без параметра, а затем в пустой экземпляр CComPtr записывается адрес из QueryInterface. AddRef будет вызван только один раз (в QueryInterface).Сказать, есть ли утечка памяти, по приведенному неполному коду нельзя. Если в метод передается правильная реализация IUnknown, то ее не должно быть, в том смысле, что в этом коде нечему вызвать утечку памяти. Есть ли утечка памяти в вашем реальном коде можно узнать с помощью отладчика, поставив точку останова на метод Release в COM-объекте. Если все нормально, при последнем вызове Release счетчик ссылок должен быть равен нулю.
Content is retrieved from StackExchange API.
Auto-generated by ruso-archive tools.