Show / Hide Table of Contents

MSDN.WhiteKnight - Stack Overflow answers

Ответ на "Есть ли утечка памяти при вызове CComPtr и QueryInterface?"

Answer 1289010

Link

Базовым классом для 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.

Back to top Stack Overflow answers (published from sources in GitHub repository). Copyright (c) 2020, MSDN.WhiteKnight. Content licensed under BSD 3-Clause License.
Generated by DocFX