我不明白为什么似乎在创建智能指针时将初始引用计数设置为两(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)”无限循环中,则不会出现明显的内存泄漏。
问题:我的代码和/或理解有什么问题?