不了解该属性的内存和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 doc 全局,并且还添加了 parse_non_destructive 标志,这些都不起作用。如果有问题,则使用Load方法的客户端将在同一线程中运行。有什么事吗 (adsbygoogle = window.adsbygoogle || []).push({}); 最佳答案 std::vector<char> xmlCopy(bytes.begin(), bytes.end());XML文档的串行表示形式的本地副本是本地的。我敢打赌,rapidXML不会复制属性,而是使用指向序列的指针。您可以通过查看属性值和文档副本的地址来进行检查。关于c++ - RapidXML,遍历DOM树时损坏的内存,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/8659461/ (adsbygoogle = window.adsbygoogle || []).push({});
10-10 03:45