首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >RapidXML节点在try catch块中具有正确的值,但它在块外部为nullptr

RapidXML节点在try catch块中具有正确的值,但它在块外部为nullptr
EN

Stack Overflow用户
提问于 2019-10-29 21:14:12
回答 2查看 49关注 0票数 1

这可能更多的是一个c++的问题,而不是rapidxml的问题,我仍然在学习c++,如果这是一个非常愚蠢的问题,非常抱歉。

我正在尝试加载try块中的XML文件:

代码语言:javascript
运行
复制
rapidxml::xml_document<> doc;
rapidxml::xml_node<>* root_node;
try 
{
    rapidxml::file<> file((data_folder + "\\application.xml").c_str());
    doc.parse<0>(file.data());
    root_node = doc.first_node("Application");

    std::cout << root_node->first_node("AppMeta");
}
catch (const std::runtime_error& e)
{
    // ...
}

这段代码正确地打印出“AppMeta”节点的指针。问题是,当我将cout行移动到块之外时:

代码语言:javascript
运行
复制
rapidxml::xml_document<> doc;
rapidxml::xml_node<>* root_node;
try 
{
    rapidxml::file<> file((data_folder + "\\application.xml").c_str());
    doc.parse<0>(file.data());
    root_node = doc.first_node("Application");
}
catch (const std::runtime_error& e)
{
    // ...
}

std::cout << root_node->first_node("AppMeta");

在这种情况下,控制台上显示的值是nullptr (00000000)。为什么会发生这种情况,以及在try catch块之后如何访问XML dom?

EN

回答 2

Stack Overflow用户

发布于 2019-10-29 21:19:53

结束try块还会调用rapidxml::file<> file的析构函数,这就是您不能再访问内容的原因。由于将文件向上移动一个作用域,在try块之外将无法捕获构造错误,请将数据复制到具有更大作用域的变量中。rapidxml::file<>::data()只是返回一个指向数据的指针,但是如果指针不再存在,就不能使用这个函数。

documentation for the file class说,“数据将自动被析构程序销毁。”

代码语言:javascript
运行
复制
rapidxml::xml_document<> doc;
rapidxml::xml_node<>* root_node;
std::string copied_data;
try 
{
    rapidxml::file<> file((data_folder + "\\application.xml").c_str());
    copied_data = file.data();
    doc.parse<0>(copied_data.c_str());
    root_node = doc.first_node("Application");
}
catch (const std::runtime_error& e)
{
    // ...
}

std::cout << root_node->first_node("AppMeta");
票数 1
EN

Stack Overflow用户

发布于 2019-10-30 00:42:02

由于try块的唯一目的是捕获该构造函数抛出的异常,因此不能将file()上移到作用域。我最终通过使用new关键字实例化该文件解决了这个问题。

代码语言:javascript
运行
复制
rapidxml::xml_document<> doc;
rapidxml::xml_node<>* root_node;
try 
{
    rapidxml::file<> *file = new rapidxml::file<>((data_folder + "\\application.xml").c_str());
    doc.parse<0>(file->data());
}
catch (const std::runtime_error& e)
{
    Utils::exitError(Utils::format("Unable to load the application data.\nDetails: %s", e.what()));
    return;
}

root_node = doc.first_node("Application");
std::cout << root_node->first_node("AppMeta")->name();
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58608175

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档