以下代码用作更大的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代码中它似乎修复了内存泄漏。)