C++プログラムからのXML処理にlibxsltでlibxml2を使用しています。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;
}
問題は、最後から2行目のアクセス違反(glibcによると:free():無効なポインター:0x00000000026d8090 * )でプログラムがクラッシュすることです。
xsltFreeStylesheetが基になるドキュメントなども解放するというヒントがドキュメントに見つからないので、ここで何が問題になっていますか?