如何修复RapidXML字符串所有权问题?

时间:2010-03-12 11:58:04

标签: c++ rapidxml

RapidXML是一个快速,轻量级的C ++ XML DOM Parser,但它有一些怪癖。

我想到的最糟糕的是:

  

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来避免这个问题?

1 个答案:

答案 0 :(得分:1)

我不使用RapidXML,但也许我的方法可以解决您的问题。

我开始使用Xerces,但我发现它很重,除了其他轻微的烦恼,所以我搬到了CPPDOM。当我做出移动时,我决定创建一组包装类,以便我的代码不依赖于特定的XML'引擎',如果需要,我可以移植到另一个。

我创建了自己的类来表示基本的DOM实体(节点,文档等)。这些类在内部使用pimpl习语来使用CPPDOM对象。 由于我的节点对象包含'真实'节点对象(来自CPPDOM),我可以根据需要管理任何内容,因此正确分配和释放字符串不会成为问题。

由于我的代码是针对CPPDOM的,我认为它不会对你有用,但如果你愿意,我可以发布它。

顺便说一句,如果你已经有太多已经使用RapidXML的代码,你可以在你的包装类中重现它的接口。我没有这样做,因为使用Xerces的代码不是很长,我还是要重写它。