rapidXML,遍历DOM树时内存损坏

时间:2011-12-28 17:57:15

标签: c++ rapidxml

不明白属性的内存和rapidXML是怎么回事。 函数封装了xml解析,如果成功,则返回对根节点的引用,当在此函数中调用遍历DOM树时,我得到存储在xml文件中的正确数据。

 typedef rapidxml::xml_node<>* Node;
 ...
 Node Load()
 {
     Node pRootNode = NULL;
     // read file stream in bytes
     ...
     std::vector<char> xmlCopy(bytes.begin(), bytes.end());
     xmlCopy.push_back('\0');
     rapidxml::xml_document<> doc;

    try
    {
      doc.parse<rapidxml::parse_declaration_node | rapidxml::parse_no_data_nodes>(&bytes[0]);
      pRootNode = doc.first_node();
          ...
          TraverseDOMTree(pRootNode);
    }
    return pRootNode;
 }

TraverseDOMTree按预期打印所有属性和节点名称。

后来,显然在Load的范围之外,pRootNode将用于从DOM中查询值三,这不起作用。 出于测试目的,调用完美工作的TraverseDOMTree,现在打印属性的垃圾值。我可以假设DOM树仍然存在,节点的层次结构与第一次调用相同,但属性值混乱。 我尝试制作 rapidxml :: xml_document&lt;&gt; doc 全局以及添加 parse_non_destructive 标志,这些都不会产生任何影响。

如果很重要,使用Load方法的客户端在同一个线程中运行。什么可能是错的?

1 个答案:

答案 0 :(得分:3)

std::vector<char> xmlCopy(bytes.begin(), bytes.end());

XML文档的序列表示的本地副本是本地的。我敢打赌,rapidXML不会复制属性,而是使用指向序列的指针。您可以通过查看属性值的地址和文档副本来检查它。