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' 超出范围,因此 doc 未定义。
void foo()
{
char name[]="Name";
char value[]="Value";
doc.append_node(doc.allocate_node(node_element, name, value));
}
按手册使用的建议allocate_string()
有效,但很容易忘记。
有没有人“增强”RapidXML 来避免这个问题?