C ++ RapidXML无法正确使用保存的xml_document

时间:2018-07-18 20:11:00

标签: c++ segmentation-fault sigsegv rapidxml

我正在尝试将一些xml字符串解析为xml_document,并将xml_document保存为变量以供进一步使用。 解析xml_document之后直接可用,但是我无法从其他方法访问它。

这里是示例代码: XML.h

//
// Created by artur on 18.07.18.
//

#ifndef PLSMONITOR_XML_H
#define PLSMONITOR_XML_H
#include <rapidxml/rapidxml.hpp>

class XML {

public:
    XML();
    void print();

private:
    rapidxml::xml_document<> _store_xml;

};

#endif //PLSMONITOR_XML_H

XML.cpp

//
// Created by artur on 18.07.18.
//

#include "XML.h"
#include <string>
#include <cstring>
#include <iostream>

using namespace std;
XML::XML() {
    std::string str{"<Store>"
                           " <Field1>1</Field1>"
                           "</Store>"
                           ""};
    char* cstr = new char[str.size() + 1];
    strcpy (cstr, str.c_str());
    _store_xml.parse<0>(cstr);
    // this prints the 1
    cout <<_store_xml.first_node("Store")->first_node("Field1")->value() << endl;
    delete [] cstr;

}

void XML::print() {
    // this exits with Process finished with exit code 139 (interrupted by signal 11: SIGSEGV)
    cout <<_store_xml.first_node("Store")->first_node("Field1")->value() << endl;

}

int main(int argc, char *argv[]) {
    cout << "Test of XML" << endl;
    XML xml{};
    xml.print();
}

在构造函数中使用xml_document很好,但是在print方法中使用它会崩溃。这是控制台输出:

  

XML测试   1

     

以退出代码139(被信号11中断)完成的过程:   SIGSEGV)

有人知道如何正确使用RapidXML文档并保存xml结构以备将来使用吗?

谢谢

1 个答案:

答案 0 :(得分:0)

问题在于,您在处置文档之前将xml字符串处置为stated in the documentation,这违反了xml_document::parse方法的约定

  

字符串必须在文档的整个生命周期内都保持不变。

xml_document不会复制字符串内容,以避免额外的内存分配,因此必须使字符串保持活动状态。您可能可以将字符串作为类字段。还要注意,在C ++ 17中,字符串类中有一个非常量限定的data方法,因此不需要分配另一个临时缓冲区。