【发布时间】:2011-12-28 17:57:15
【问题描述】:
不明白属性的内存和 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 3中查询值,这样就不行了。 出于测试目的调用 TraverseDOMTree,它完美地工作,现在打印属性的垃圾值。我可以假设 DOM 树仍然存在,与第一次调用中的节点层次结构相同,但属性值搞砸了。 我尝试将 rapidxml::xml_document doc 设为全局并添加 parse_non_破坏性 标志,但这些都没有影响。
如果重要的话,使用 Load 方法的客户端在同一个线程中运行。有什么问题?
【问题讨论】: