c++ rapidxml 无法正确使用保存的 xml_document

c++ rapidxml cant use saved xml_document properly

我正在尝试将一些 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方法中使用它会崩溃。这是控制台输出:

Test of XML 1

Process finished with exit code 139 (interrupted by signal 11: SIGSEGV)

有人知道如何正确使用 rapidxml 文档并保存 xml 结构以供进一步使用吗?

谢谢

问题是您在处理文档之前处理 xml 字符串违反了 xml_document::parse 方法的约定,如 stated in the documentation

The string must persist for the lifetime of the document.

xml_document 不会复制字符串内容以避免额外的内存分配,因此字符串必须保持活动状态。您可以将字符串设为 class 字段。另请注意,对于 C++17,字符串 class 中有一个非 const 限定的 data 方法,因此无需分配另一个临时缓冲区。