2011-12-28 26 views
2

不明白屬性內存和rapidXML發生了什麼。 函數封裝xml解析,如果成功,則返回對根節點的引用,當調用此函數內部的遍歷DOM樹時,我將獲取存儲在xml文件中的正確數據。rapidXML,遍歷DOM樹時損壞的內存

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 global並且還添加了parse_non_destructive標誌,這些都沒有什麼不同。

如果有問題,使用Load方法的客戶端在同一個線程中運行。什麼可能是錯誤的?

回答

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

XML文檔的串行表示的本地副本是本地的。我敢打賭,rapidXML不會複製屬性,而是使用指向序列的指針。您可以通過查看屬性值的地址和文檔副本來檢查。

+0

它是非常有意義的,但我確實嘗試了一個持久性文檔,並沒有工作。至少它會持續到包含它的類沒有被銷燬,這正是我正在做的,據我所知,這是正確的,但還有其他的錯誤。知道文檔是否有清除/清除/重置方法...正在檢查它也是有用的。 – notNullGothik 2011-12-28 18:03:35

+0

是的。謝謝! – notNullGothik 2011-12-28 18:22:10

+0

這個答案真的救了我,謝謝!我有一個函數接受一個字符串和一個文檔的引用,並用解析函數對引用進行了變異。問題在於它是使用本地字符串進行分析的,該字符串立即超出了範圍。 稍後在遍歷文檔時,當字符串最終被覆蓋在內存中時,它會不確定地失敗。 – 2017-06-14 21:56:47