gpt4 book ai didi

c++ - 如何解决 RapidXML 字符串所有权问题?

转载 作者:可可西里 更新时间:2023-11-01 18:39:48 30 4
gpt4 key购买 nike

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

在我看来最糟糕的是:

3.2 Ownership Of Strings.

Nodes and attributes produced by RapidXml do not own their name and value strings. They merely hold the pointers to them. This means you have to be careful when setting these values manually, by using xml_base::name(const Ch *) or xml_base::value(const Ch *) functions.

Care must be taken to ensure that lifetime of the string passed is at least as long as lifetime of the node/attribute. The easiest way to achieve it is to allocate the string from memory_pool owned by the document. Use memory_pool::allocate_string() function for this purpose.

现在,我知道这样做是为了提高速度,但这感觉就像一场等待发生的车祸。以下代码看起来无害,但当 foo 返回时“名称”和“值”超出范围,因此文档未定义。

void foo()
{
char name[]="Name";
char value[]="Value";

doc.append_node(doc.allocate_node(node_element, name, value));
}

根据手册使用 allocate_string() 的建议有效,但很容易忘记。

有没有人“增强”RapidXML 来避免这个问题?

最佳答案

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

我开始使用 Xerces,但我发现它很重,还有其他一些小麻烦,所以我转向了 CPPDOM。当我采取行动时,我决定创建一组包装器类,这样我的代码就不会依赖于特定的 XML“引擎”,并且我可以在需要时移植到另一个。

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

由于我的代码是针对 CPPDOM 的,所以我认为它对您没有多大用处,但如果您愿意,我可以发布它。

顺便说一句,如果您已经有太多使用 RapidXML 的代码,您可以在包装类中重现它的接口(interface)。我没有这样做,因为使用 Xerces 的代码没有那么长,无论如何我都必须重写它。

关于c++ - 如何解决 RapidXML 字符串所有权问题?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2432478/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com