2011-12-28 6 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は、すべての属性とノード名を期待どおりに出力します。

後で明らかに、ロードの範囲外では、pRootNodeがDOM3から値を照会するために使用されますが、これは機能しません。 完全に機能したTraverseDOMTreeを呼び出すためのテスト用として、属性のガベージ値を出力するようになりました。私はDOMツリーがまだそこにあると仮定することができます。最初の呼び出しと同じ階層のノードですが、属性値は崩れてしまいます。 rapidxml :: xml_document <>文書をグローバルに作成し、さらにのparse_non_destructiveフラグを追加しようとしましたが、どれも違いはありません。

問題がある場合、Loadメソッドを使用するクライアントは同じスレッドで実行されています。何が間違っていますか?

答えて

3

XMLドキュメントのシリアル表現のローカルコピーはローカルです。私はrapidXMLが属性のコピーを作成せず、むしろシーケンスへのポインタを使用すると確信しています。属性値のアドレスとドキュメントのコピーを調べることで確認できます。

+0

私は永続的な文書を作成しようとしましたが、機能しませんでした。少なくとも、それを含むクラスが破壊されない限り、それはまさに何をしているのか、私はこれが正しいと理解できる限り、何か間違いがまだあります。また、ドキュメントがクリア/クリーン/リセットメソッドを持っているかどうかを知ることは役に立ちます。チェックしています。 – notNullGothik

+0

そうです。ありがとう! – notNullGothik

+0

この回答は本当に私を救った、ありがとう!私は、文字列とドキュメントへの参照を取得し、parse関数で参照を変更する関数を持っていました。問題は速やかに範囲外になったローカル文字列と解析されたことでした。 後でドキュメントを走査中に、文字列が最終的にメモリに上書きされたときに不確定に失敗します。 –

関連する問題