visual-c++ - IXMLDOMDocument 内存泄漏问题

标签 visual-c++ memory-leaks com mfc atl

我有一个 COM inproc 服务器测试应用程序,它使用 IXMLDOMDocument 写入数据并将其发送回 COM 客户端。我使用 get_xml() 获取 BSTR。但是当应用程序结束时,它会消耗几乎 > 20 MB 内存,而如果我不使用 COM inproc 服务器,它会使用 < 1 MB 内存。
我的COM服务器接口(interface)方法是

[
    object,
    uuid(BF798ED1-DCDD-4B29-B552-3A17F1D7E4CF),
    dual,
    nonextensible,
    pointer_default(unique)
]
interface IMoLauncher : IDispatch{
    [id(1)] HRESULT GetXML([out] BSTR* bStr);
};

它的代码是

STDMETHODIMP CMoLauncher::GetXML(BSTR* bStr)
{
    AFX_MANAGE_STATE(AfxGetStaticModuleState());
    BOOL result = FALSE;
    IXMLDOMDocument* pDoc = NULL;
    HRESULT hr = CoCreateInstance(CLSID_DOMDocument, NULL, CLSCTX_INPROC_SERVER,
                                  IID_IXMLDOMDocument, (void**)&pDoc);

    if ( SUCCEEDED(hr) )
    {
        result = TRUE;
        IXMLDOMNode* pEntityNode = InsertDOMElement(pDoc, NULL, L"Entity", NULL);
        SerializeXML(pDoc, pEntityNode);
        pDoc->get_xml(bStr);
        pDoc->Release();
    }
    return result;
}

客户端中的使用代码是

CoInitialize(NULL);
IMoLauncher* launcher = NULL;
IUnknown* unknown = NULL;
HRESULT result = CoCreateInstance(CLSID_MoLauncher,NULL,CLSCTX_INPROC_SERVER,IID_IMoLauncher,(void**)&launcher);
if(result==S_OK)
{
    for(int i=0;i<iterationCount;i++)
    {
        BSTR bStr;
        launcher->GetXML( &bStr);
        printf("Iteration %d\n",i);
        ::SysFreeString(bStr);
    }
}
launcher->Release();
CoUninitialize();

最佳答案

您还需要释放 pEntityNode!

接口(interface)或 COM 函数返回的每个 COM 指针都必须被释放。您可以使用智能指针来避免此类错误。

关于visual-c++ - IXMLDOMDocument 内存泄漏问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21677262/

相关文章:

.net - 是否可以使用 .NET 泛型类实现 COM 接口(interface)?

windows - Delphi 应用程序与偶尔崩溃的程序通信 - 供应商指责我的 Delphi 应用程序

c++ - 无法通过命令行禁用 OpenCV/MSVC C4265(无虚拟析构函数)错误

c - libxml2:xmlNewTextWriterFilename 泄漏

c++ - MSVC 是否支持 C++11 样式的属性而不是 __declspec?

c++ - 双重删除会发生什么?

swift - 如何取消初始化 CollectionView 类

c++ - 错误 C2143 : syntax error : missing ';' before '__stdcall"

c++ - 如何设置检查菜单项mfc C++

Windows 7 -> vs10 -> OpenCV *DesperateForHelp*