在c++中使用xerces调用getDocument时出现分段错误

Segmentation fault when calling getDocument using xerces for c++

本文关键字:分段 错误 getDocument 调用 c++ xerces      更新时间:2023-10-16

大家好。我有parser.h . sample.cpp(作为父节点)和main.cpp。我得到获取getDocument时出现分段错误。谁能帮我一下……下面是我的代码:

parser.h

int Parser::Load(const char* xmlFile) {  
    try {  
        XMLPlatformUtils::Initialize();  
    }  
    catch (const XMLException& toCatch) {  
        char* message = XMLString::transcode(toCatch.getMessage());
        cout << "Error during initialization! :n"  
             << message << "n";  
        XMLString::release(&message);  
        return 1;  
    }
    XercesDOMParser* parser = new XercesDOMParser();  
    parser->setValidationScheme(XercesDOMParser::Val_Always);  
    parser->setDoNamespaces(true);  
    ErrorHandler* errHandler = (ErrorHandler*) new HandlerBase();  
    parser->setErrorHandler(errHandler);  
    try {  
        parser->parse(xmlFile);  
    }
    catch (const XMLException& toCatch) {  
        char* message = XMLString::transcode(toCatch.getMessage());  
        cout << "Exception message is: n"  
             << message << "n";  
        XMLString::release(&message);  
        return -1;  
    }  
    catch (const DOMException& toCatch) {  
        char* message = XMLString::transcode(toCatch.msg);  
        cout << "Exception message is: n"  
             << message << "n";  
        XMLString::release(&message);  
        return -1;  
    }
    catch (...) {  
        cout << "Unexpected Exception n";  
        return -1;  
    }  
}  

void Sample::getXmlNodes(ParseXml* xmlParser){  
    map<std::string, std::string> attribList;  
    xmlParser->xmlDoc = xmlParser->parser->getDocument();  
    xmlParser->xmlNode = xmlParser->xmlDoc->getFirstChild();  
    attribList = xmlParser->getNodeAttribute(xmlParser->xmlNode);  
}  

main.cpp

#include "parser.h"  
#include "sample.cpp"
int main(int argc,char **argv){  
    const char* xmlString="sample.xml";  
    Parser* xmlObj;  
    Sample sampObj;
    xmlObj->Load(xmlString);  
    sampObj.getXmlNodes(xmlObj);  
    cout << "Done creating object..." << endl;  
    xmlObj->Cleanup();  
    return 0;  
}

您没有为xmlObj objetc分配内存:

Parser* xmlObj;
Sample sampObj;  
xmlObj->Load(xmlString);   // SIGSEV here, you have no object to invoke

必须替换为:

Parser xmlObj;  
Sample sampObj;  
xmlObj.Load(xmlString);
sampObj.getXmlNodes(&xmlObj);