为啥pugixml解析的数据会丢失在另一个函数中?

Posted

技术标签:

【中文标题】为啥pugixml解析的数据会丢失在另一个函数中?【英文标题】:Why is the data parsed by pugixml lost in another function?为什么pugixml解析的数据会丢失在另一个函数中? 【发布时间】:2022-01-12 19:05:57 【问题描述】:

我有两个功能:

void XMLParser::ParseScene(const char* path)

    // Load the XML file
    pugi::xml_document doc;
    pugi::xml_parse_result result = doc.load_file(path);

    scene = doc.child("scene");

void XMLParser::CreateModelLights(pugi::xml_node node)

    GLuint i = 0;
    for (pugi::xml_node entity : node.children())
    
        [...]
    

我正在调用parser.ParseScene("src/xml/scene.xml"); 来生成parser.scene,然后调用parser.CreateModelLights(parser.scene);,但它在node 参数/parser.scene 中给了我垃圾数据。

如果我将scene = doc.child("scene"); 放在CreateModelLight() 第一行,它将在parser.scene 中解析我的数据,但我不想像那样强制节点,因为我正在递归调用该函数。理想情况下,我想在 ParseScene() 中解析我的 XML,然后将其存储在标头中声明的 pugi::xml_node 变量中,我可以在 CreateModelLights() 等函数中使用它。

XML 看起来像这样:

<?xml version="1.0" encoding="UTF-8"?>
<scene>
    [...]
</scene>

我得到的垃圾数据:

我应该得到的数据:

【问题讨论】:

这是一个变相的“悬空指针”问题:所有pugi::xml_node 对象引用pugi::xml_document 内的数据。只要您有指向它的 pugi::xml_node 对象,您就应该保持 pugi::xml_document 活动。 我明白了。所以如果我动态分配文档并销毁文档,当我完成后我应该不会再遇到这个问题,对吧? 正确。就像让doc 成为XMLParser 的成员一样简单。 @Botje 它按预期工作。您能否发布一个答案,以便我可以投票作为解决方案? 【参考方案1】:

这在文档中不是很清楚,但 PugiXML 使用了一种相当常见的内存管理模式:pugi::xml_document 拥有整个 XML DOM 树,而pugi::xml_node 对象只是指向这棵树。

这意味着只要有pugi::xml_node 对象指向它,您就需要保持pugi::xml_document 对象处于活动状态。可能最快的方法是将doc 提升为成员变量。

【讨论】:

以上是关于为啥pugixml解析的数据会丢失在另一个函数中?的主要内容,如果未能解决你的问题,请参考以下文章

当我在 plotly 中使用 ggplotly 函数时,为啥文本注释会丢失?

为啥我不能在另一个函数中定义一个函数?

为啥在一个函数中声明的联合类型在另一个函数中使用无效?

存储过程中为啥会丢失小数点前面的0

为啥我在 Android 上运行之间会丢失可编写脚本对象中的数据,但在编辑器中却没有?

为啥 Firebase 会在 once() 函数之外丢失引用?