为什么pugixml解析出来的数据在另一个函数中丢失了?

Why is the data parsed by pugixml lost in another function?

我有两个功能:

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,然后将其存储在 header 中声明的 pugi::xml_node 变量,我可以在 CreateModelLights() 等函数中使用它。

XML 看起来像这样:

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

我得到的垃圾数据:

我应该得到的数据:

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

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