gpt4 book ai didi

c++ - 读取 xml 节点列表导致段错误

转载 作者:太空宇宙 更新时间:2023-11-04 12:56:39 25 4
gpt4 key购买 nike

我尝试为我使用的游戏服务器引擎开发一个包系统,所以,在开始时,我读取了一个 XML 文件并将节点添加到列表中,以便以后使用。创建列表后,我可以用同样的方法阅读它。但是当我尝试从另一个文件读取它时,它会给我段错误。让我们看一些代码。

首先,我添加了一个packages.cpppackages.h。它们看起来像:

包.cpp

#include "otpch.h"
#include "packages.h"
#include "pugicast.h"
#include "tools.h"
#include "events.h"

std::list<pugi::xml_node> packages;

Packages::Packages()
{
//
}

bool Packages::loadFromXml()
{
std::string packagesPath = "data/packages";
pugi::xml_document packagesDoc;
pugi::xml_parse_result packagesResult = packagesDoc.load_file((packagesPath + std::string("/packages.xml")).c_str());
if (!packagesResult) {
printXMLError("Error - BaseEvents::loadFromXml", "data/packages/packages.xml", packagesResult);
return false;
}

for (auto packageNode : packagesDoc.child("packages").children()) {
packages.push_back(packageNode);
}

// I can read the list here without any problem.

return true;
}

包.h:

extern std::list<pugi::xml_node> packages;

class Packages
{
public:
Packages();
bool loadFromXml();
};

然后我将这段代码添加到启动文件中

Packages g_packages;

void mainLoader()
{
std::cout << ">> Loading packages" << std::endl;
if (!g_packages.loadFromXml()) {
startupErrorMessage("Unable to load packages!");
return;
}
}

最后,我尝试在另一个文件中像这样迭代这个列表:

#include "packages.h"

bool Events::loadFromPackages()
{
for (auto& package : packages) {
std::cout << package.name() << std::endl; // segmentation fault
}
}

感谢任何帮助。

最佳答案

移动pugi::xml_document packagesDoc;到全局范围可能会解决这个问题。

pugi::xml_document超出范围并被销毁,所有xml_node与该文档中的节点关联的对象变得无效。这类似于 STL 容器中的迭代器 - 您可以获得 std::list 的迭代器元素,但破坏了 list对象意味着您无法访问它们。

可能更好的解决方案是在这里使用全局变量以外的东西 - 例如,可能将 xml_document 都放在一起和 std::list<xml_node>Packages里面class 是更好的选择,但这在某种程度上取决于您希望代码具有的结构。

关于c++ - 读取 xml 节点列表导致段错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46246977/

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