为什么_bstr_t会破坏堆?

时间:2016-11-29 23:19:42

标签: visual-c++ visual-studio-2015 memory-leaks msxml heap-corruption

以下代码用作更大的MSXML解析项目的一部分。我最近从Visual Studio 2008切换到Visual Studio 2015.此方法在许多地方重复使用。在VS2008中没有崩溃。在VS2015中,它只在一个地方崩溃,但它总是在同一个地方崩溃。

'修复'我添加的是靠近底部," bstrXpath.Assign(NULL); "而且我担心我应该采取不同的做法。为什么堆被一个_bstr_t损坏而不是另一个2?唯一的区别是价值传入。

我不确定它是否有所作为,但导致腐败的唯一价值是当pInXmlFile设置为L" medianame / medianame_item [@language =' EN'] "当然,那个记忆就在堆里。

HRESULT GetSelectNode(MSXML2::IXMLDOMNode **ppOutXMLDomSelectNode, const wchar_t *pInXmlFilePath, const wchar_t *pInXpath)
{
    HRESULT hr = S_OK;
    _bstr_t bstrXpath = SysAllocString(pInXpath);
    _bstr_t bstrPropertyNameLang = SysAllocString(L"SelectionLanguage");
    _bstr_t bstrPropertyNameNameSpace = SysAllocString(L"SelectionNamespaces");
    VARIANT_BOOL varbResult;
    CComVariant vPath(pInXmlFilePath);
    CComVariant vXPath("XPath");
    CComVariant vIvecNamespace(IVEC_CMD_NAMESPACE_TEXT);

    MSXML2::IXMLDOMDocument2Ptr pXMLDoc = NULL;
    hr = pXMLDoc.CreateInstance(__uuidof(DOMDocument60));

    //... Do stuff with the variables above, checking for errors and stuff.

    pXMLDoc.Release();
    SysFreeString(bstrXpath);
    bstrXpath.Assign(NULL);
    SysFreeString(bstrPropertyNameLang);
    SysFreeString(bstrPropertyNameNameSpace);

    return hr;
}

这是生产代码。我只是在最后一天左右调试但收效甚微,但是这里有人建议在一个看似与此问题无关的旧帖子中使用.Assign(NULL)。这就是我尝试过的东西,我不知道它为什么会起作用。

我不是MSXML的专家,但它不再是一个选择。这是我母公司的源代码,我试图堵塞内存泄漏。我与之合作的任何人都曾与MSXML或_bstr_t混淆。

更多细节:VS2015中的实际崩溃发生在最后一行"返回hr;"深入comutil.c _Free()方法中的callstack。两个硬编码的字符串被解除分配而没有错误,但是bstrXpath会抛出错误。 (将该行添加到2008代码中它似乎修复了内存泄漏。)

0 个答案:

没有答案