我使用libxml2和libxslt从C++程序进行XML处理。为了用XSL转换XML文档,我使用了以下函数(删除了错误处理):
xmlDocPtr
transformXmlDocument(
const xmlDocPtr inputDocument,
const std::string& stylesheetString
) {
exsltRegisterAll();
// Read the stylesheet document.
xmlDocPtr stylesheetDocument = xmlReadMemory(
stylesheetString.c_str(),
stylesheetString.length(),
"stylesheet.xsd",
0, // No encoding set - get it from the file header.
0 // No further options.
);
// Parse the stylesheet
xsltStylesheetPtr stylesheet = xsltParseStylesheetDoc(stylesheetDocument);
// Transform the document
xmlDocPtr result = xsltApplyStylesheet(stylesheet, inputDocument, 0);
// Free used resources
xsltFreeStylesheet(stylesheet);
xsltCleanupGlobals();
// Here the program crashes
xmlFreeDoc(stylesheetDocument);
return result;
}
问题是,该程序在最后一行出现访问冲突(glibc says:free():无效指针:0x00000000026d8090*)而崩溃。
我在文档中找不到xsltFreeStylesheet也释放底层文档或其他内容的任何提示,那么这里出了什么问题?
xsltFreeStylesheet还释放底层文档或其他东西
精细的手册中有一些提示,表明这种情况确实有可能发生。