为什么IXMLDOMDocument2-> get_documentElement给我的IXMLDOMElement *的引用计数设置为2?

时间:2019-07-16 14:06:35

标签: com smart-pointers atl msxml msxml6

我不明白为什么似乎在创建智能指针时将初始引用计数设置为两(2),但之后没有明显的内存泄漏。

MRE:

#include <Windows.h>
#include <MsXml2.h>
#include <atlcomcli.h>

int main() {

    bool bCoIntOk = false;
    HRESULT hr = CoInitializeEx( nullptr, COINIT_APARTMENTTHREADED );
    if ( hr == S_OK ) {
        bCoIntOk = true;
        CComPtr<IXMLDOMDocument2> spIXMLDOMDocument2;
        hr = spIXMLDOMDocument2.CoCreateInstance( L"Msxml2.DOMDocument.6.0",
                                                  nullptr, CLSCTX_INPROC_SERVER );
        if ( hr == S_OK ) {
            VARIANT_BOOL vbSuccess = VARIANT_FALSE;
            hr = spIXMLDOMDocument2->loadXML( CComBSTR( L"<root/>" ), &vbSuccess );
            if ( hr == S_OK && vbSuccess == VARIANT_TRUE ) {
                CComPtr<IXMLDOMElement> spIXMLDOMElement;
                hr = spIXMLDOMDocument2->get_documentElement( &spIXMLDOMElement );
                if ( hr == S_OK ) {
                    spIXMLDOMDocument2.Release();
                    spIXMLDOMElement.p->AddRef();
                    ULONG ulRefCount = spIXMLDOMElement.p->Release();
                    printf( "IXMLDOMElement RefCount is %u\n", ulRefCount );
                }
            }
        }
    }
    if ( bCoIntOk ) CoUninitialize();

}

输出结果:

  

IXMLDOMElement RefCount为2

我认为,接口指针会将“引用计数”设置为恰好在最后一个“发行版”之前的一(1),以避免内存泄漏。 事实是,如果将上面的代码放入“ while(true)”无限循环中,则不会出现明显的内存泄漏。

问题:我的代码和/或理解有什么问题?

0 个答案:

没有答案