我们正在使用libxml2来针对包含“已注册” vars的xmlcontext解析xpath。我们的析构函数尝试清除xmlXPathContextPtr和xmlDocPtr:
~CLibXpathContext()
{
xmlXPathFreeContext(m_xpathContext); //causes crash if any vars registered
xmlFreeDoc(m_xmlDoc);
}
我们正在注册var,如下所示:
virtual bool addVariable(const char * name, const char * val) override
{
if (m_xpathContext )
{
xmlXPathObjectPtr valx = xmlXPathWrapCString((char*)val);
return xmlXPathRegisterVariable(m_xpathContext, (xmlChar *)name, valx) == 0;
}
return false;
}
libxml2清理代码如下:
void xmlXPathFreeContext(xmlXPathContextPtr ctxt) {
if (ctxt == NULL) return;
if (ctxt->cache != NULL)
xmlXPathFreeCache((xmlXPathContextCachePtr) ctxt->cache);
xmlXPathRegisteredNsCleanup(ctxt);
xmlXPathRegisteredFuncsCleanup(ctxt);
xmlXPathRegisteredVariablesCleanup(ctxt); // this is causing the issue
xmlResetError(&ctxt->lastError);
xmlFree(ctxt);
}
有什么想法可能是我做错了,还是libxml2代码有问题?
在调用xmlXPathFreeContext方法之前,我们还尝试注销所有已注册的var。
最佳答案
您必须使用xmlXPathNewCString(const char *)
而不是xmlXPathWrapCString(char *)
。前者创建字符串的副本,而后者将字符串的所有权转移到XPath对象,当XPath对象被破坏时释放原始字符串。