RapidXMLは、高速で軽量なC ++ XML DOMパーサーですが、いくつかの癖があります。
私の心にこれらの最悪のものはこれです:
3.2文字列の所有権。
RapidXmlによって生成されたノードと属性は、それらの名前と値の文字列を所有していません。それらは単にそれらへのポインタを保持します。
xml_base::name(const Ch *)
つまり、またはxml_base::value(const Ch *)
関数を使用してこれらの値を手動で設定する場合は注意が必要です。渡される文字列の存続期間が少なくともノード/属性の存続期間と同じになるように注意する必要があります。これを実現する最も簡単な方法は、ドキュメントが所有するmemory_poolから文字列を割り当てることです。
memory_pool::allocate_string()
この目的のために関数を使用 してください。
今、私はそれがスピードのためにこのように行われていることを理解しています、しかしこれは自動車事故が起こるのを待っているように感じます。次のコードは無害に見えますが、fooが戻ると、「name」と「value」はスコープ外であるため、ドキュメントは未定義です。
void foo()
{
char name[]="Name";
char value[]="Value";
doc.append_node(doc.allocate_node(node_element, name, value));
}
手動で使用するという提案はallocate_string()
機能しますが、忘れがちです。
この問題を回避するためにRapidXMLを「拡張」した人はいますか?