将指针从一个函数传递到另一个函数会返回一个地址,但访问该地址会导致分段错误

时间:2018-09-02 10:57:25

标签: qt tinyxml2

下面是加载文件的代码。在单击按钮事件时,调用加载函数,该函数返回XMLElement指针变量。(返回有效地址),但由于发生分段错误而无法使用-> operator访问XMlElement的成员。

with open('output.json', 'w', encoding='utf-8') as file:
    df2.reset_index().to_json(file, orient='records', force_ascii=False)

}
下面是单击按钮的代码。

XMLElement *XMLUtilities::load(string filepath)
{
    XMLDocument doc;
    char *cstr = new char[filepath.length() + 1];
    strcpy(cstr, filepath.c_str());
    XMLError err=doc.LoadFile(cstr);
    XMLElement *root=nullptr;
    if(err==XML_ERROR_FILE_NOT_FOUND)
    {
        return nullptr;
    }
    else
    {
         root=doc.FirstChildElement();
         cout<<root->Name();
        return root;
    }

1 个答案:

答案 0 :(得分:1)

AS @Sami Kuhmonen在评论中指出,问题在于,当方法 MainWindow on_pushButton_clicked()完成时,所有局部变量都将被破坏,包括< strong> doc 。这会破坏文档中的所有节点,元素……等等,当然包括根节点。

最简单的解决方案是返回文档,而不仅仅是返回根元素。

XMLDocument XMLUtilities::load(string filepath)
{
    XMLDocument doc;
    // ...
    return doc;
}

不幸的是,对于此示例,这是不可能的,因为 tinyxml2 的作者认为允许将整个文档复制到内存中效率不高(这是一件好事)。

我能想到的唯一可能性是实际上在 XMLUtilities load()中读取XML,并返回指向您自己类的根对象的指针,不是 XMLNode XMLElement

例如,如果您正在阅读有关汽车的信息,例如:

<cars>
    <car plate="000000">
        <owner ...
    </car>
    ...
</cars>

您将返回一个指向类 CarsList 的指针,该类表示根元素 cars 。按照您的代码,如果找不到文件或无法检索数据,则该指针将为 nullptr

希望这会有所帮助。