0

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が基になるドキュメントなども解放するというヒントがドキュメントに見つからないので、ここで何が問題になっていますか?

4

1 に答える 1

2

xsltFreeStylesheetは、基になるドキュメントなども解放します

すばらしいマニュアルには、このシナリオが実際に発生する可能性があることを示唆するヒントがいくつかあります。

于 2012-09-09T19:40:22.980 に答える