【问题标题】:Segmentation fault when calling getDocument using xerces for c++使用 c++ 的 xerces 调用 getDocument 时出现分段错误
【发布时间】:2011-10-19 08:32:56
【问题描述】:

美好的一天。我有 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;  
    }  
}  

sample.cpp

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);  
}  

ma​​in.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;  
}

我不知道我的代码有什么问题...

【问题讨论】:

    标签: c++ xerces xerces-c


    【解决方案1】:

    您没有为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);
    

    【讨论】:

    • 在获取 getDocument 期间仍然存在段错误。我试过 XercesDOMParser* 解析器; DOMDocument* xmlDoc; xmlDoc = parser->getDocument();我的属性计数为 0
    • 发布您的调试回溯并完成示例代码。我不明白XercesDOMParser* parser; DOMDocument* xmlDoc; xmlDoc = parser-&gt;getDocument() 是什么意思。但是,如果没有更多信息,我假设您没有为XercesDOMParser objetc 分配内存,同样,您在没有有效内存分配的情况下使用它们。为什么要使用指针? XercerDOMParser parser; DOMDocument *xmlDoc = parser.getDocument();之类的有什么问题吗
    • 代码如下: void Sample::getXmlNodes(ParseXml* xmlParser){ map<:string std::string> attribList; XercesDOMParser* 解析器; DOMDocument* xmlDoc; xmlDoc = parser->getDocument(); //xmlParser->xmlDoc = xmlParser->parser->getDocument(); DOMNode* xmlNode = xmlParser->xmlDoc->getFirstChild(); attribList = xmlParser->getNodeAttribute(xmlParser->xmlNode); }
    • 我认为 Parser->parse(xmlString); 有问题因为我在调用 getDocument 时得到了 Null。我想我没有通过 xmlObj->Load(xmlString);对。有什么解决办法吗?
    • 你不能使用parser而不为它分配内存。将XercesDOMParser* parser; DOMDocument* xmlDoc; xmlDoc = parser-&gt;getDocument() 替换为XercesDOMParser parser; DOMDocument* xmlDoc; xmlDoc = parser.getDocument()
    猜你喜欢
    • 2015-01-03
    • 1970-01-01
    • 1970-01-01
    • 2011-02-27
    • 2020-05-29
    • 1970-01-01
    • 1970-01-01
    • 2016-07-23
    • 2018-03-17
    相关资源
    最近更新 更多