c++快速xml访问违反一定的时间后(visual studio 2013)

C++ rapidxml access violation after a certain amount of time (visual studio 2013)

本文关键字:时间 visual studio 2013 xml 快速 访问 c++      更新时间:2023-10-16

我一直在使用优秀的rapidxml库来读取和使用XML文件中的信息,以保存我用c++编程的游戏的过场动画信息。我遇到了一个奇怪的问题,

我首先将XML文件从std::ifstream* XMLFile加载到rapidxml::xmldocument<>*

std::stringstream buffer; //Create a string buffer to hold the loaded information
buffer << XMLFile->rdbuf(); //Pass the ifstream buffer to the string buffer
XMLFile->close(); //close the ifstream
std::string content(buffer.str()); //get the buffer as a string
buffer.clear();
cutScene = new rapidxml::xml_document<>;
cutScene->parse<0>(&content[0]);
root = cutScene->first_node();

我的过场动画xml文件是由"零件"组成的,一开始我想把所有这些零件(都是xml_nodes)加载到一个矢量

//Load parts
if (parts->size() == 0) {
    rapidxml::xml_node<>* partNode = root->first_node("part");
    parts->push_back(partNode);
    for (int i = 1; i < numParts; i++) {
        parts->push_back(partNode->next_sibling());
        printf("name of part added at %i: %s.n", i, parts->at(i)->name());
    }
}

最后一行将"part name of part added at 1: part"打印到控制台。问题是出于某种原因,每当我尝试访问向量并打印相同特定部分的相同名称时,而不是作为此方法的一部分,该名称可以访问,但只是字母和数字的随机字符串。似乎由于某种原因,在我的加载方法完成后,rapidxml删除了所有内容。我仍然是新的张贴在stackoverflow所以如果你需要更多的信息只是问,谢谢!

Rapidxml是原位xml解析器。它改变原始字符串缓冲区(在您的例子中是content),以格式化以空结尾的令牌,如元素和属性名。其次,通过xml_document (currscene)实例定义parts项引用的树节点的生命周期。

currscenecontent实例与矢量保持在一起,这也将使矢量项保持活动。例句:

 struct SceneData
 {
    std::vector<char> content;
    rapidxml::xml_document<> cutScene;
    std::vector<rapidxml::xml_node<>*> parts;
    bool Parse(const std::string& text);
 };
 bool SendData::Parse(const std::string& text)
 {
       content.reserve(text.length() + 1);
       content.assign(text.begin(), text.end());
       content.push_back('');
       parts.clear();
       try
       {
         cutScene.parse<0>(content.data());
       }
       catch(rapidxml::parse_error & err)
       {
           return false;
       }

       // Load parts.   
       rapidxml::xml_node<>* root = cutScene.first_node();      
       rapidxml::xml_node<>* partNode = root->first_node("part");
       parts->push_back(partNode);
       for (int i = 1; i < numParts; i++) {
             parts->push_back(partNode->next_sibling());
             //printf("name of part added at %i: %s.n", i, parts->at(i)->name());
       }
       return true ;
  }

解析器期望以'结尾的字符序列作为输入。由于&string[0]引用的缓冲区不能保证以null结束,因此建议将字符串内容复制到std::vector<char>中。