Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/138.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/qt/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 读取访问冲突第二次创建QdomeElement_C++_Qt_Qdomdocument - Fatal编程技术网

C++ 读取访问冲突第二次创建QdomeElement

C++ 读取访问冲突第二次创建QdomeElement,c++,qt,qdomdocument,C++,Qt,Qdomdocument,我编写了一个类来处理XML文件。该类在构建时加载文件,并在销毁时保存。当类处于活动状态时,我有几个getter和setter函数来更改值。其中一个是记录一些文件重命名的函数。每次调用时,它都会为元素重命名创建一个新的子元素 void DataElementHandle::renamed(QString new_name, QString old_name) { QDomElement elem_ren = xml_doc.createElement("renamed"); QDo

我编写了一个类来处理XML文件。该类在构建时加载文件,并在销毁时保存。当类处于活动状态时,我有几个getter和setter函数来更改值。其中一个是记录一些文件重命名的函数。每次调用时,它都会为元素重命名创建一个新的子元素

void DataElementHandle::renamed(QString new_name, QString old_name)
{
    QDomElement elem_ren = xml_doc.createElement("renamed");
    QDomAttr att = xml_doc.createAttribute("time");
    att.setValue(QDateTime::currentDateTime().toString(Qt::ISODate));
    elem_ren.setAttributeNode(att);

    QDomText t = xml_doc.createTextNode(old_name + " -> " + new_name);
    elem_ren.appendChild(t);

    elem_renames.appendChild(elem_ren);
}
问题:现在,我创建DataElementHandle类,并为文件的每次更改调用重命名函数。但每当我调用该函数时,我的程序就会崩溃,并显示以下错误消息:

引发异常:读取访问冲突。 在函数的第一行抛出错误

我不明白为什么会这样。我想我不能覆盖QdomeElement,因为仍然有一个指向第一次调用时创建的元素的链接。但是怎么做呢?它应该在函数的末尾消失

我将Qt 5.8与Visual Studio 2015和Visual泄漏检测器一起使用

头文件:

// Version
const quint32 version = 1;

// Doc file path
QString file_path;
bool load_file_ok;

// Doc
QDomDocument xml_doc;
QDomElement root;

// First root elements
QDomElement elem_renames;
如果XML文件不存在,则会像这样创建一个新模板,并将其保存到析构函数中的文件中

xml_doc = QDomDocument("data_xml");
root = xml_doc.createElement("root");
root.setAttribute("version", QString::number(version));
xml_doc.appendChild(root);

elem_renames= xml_doc.createElement("renames");

root.appendChild(elem_renames);
编辑1:我已经设置了一个测试项目,在那里它运行良好。我必须更详细地调查这个问题。

解决了 我真傻。我有一个这样的设置。我在for循环中声明并初始化了指向XML类的指针。因为我在下面的if语句中删除了旧类并创建了一个新类,所以我第一次在if语句中初始化了指针,但第二次删除了它

#include <QCoreApplication>
#include <QDomDocument>
#include <QFile>
#include <QDateTime>
#include <QString>
#include <QDebug>

class TestDomClass
{
public:
    TestDomClass(QString file_path) :
        path(file_path)
    {
        xml_doc = QDomDocument("data_xml");
        root = xml_doc.createElement("root");
        root.setAttribute("version", QString::number(version));
        xml_doc.appendChild(root);

        elem_renames= xml_doc.createElement("renames");

        root.appendChild(elem_renames);
    }
    ~TestDomClass()
    {
        QFile file(path);
        if(!file.open(QIODevice::WriteOnly | QIODevice::Text))
        {
            // TODO
            qDebug() << "Failed to open file for writing!";
        }
        else
        {
            QTextStream stream(&file);
            stream << xml_doc.toString();
        }

        if(file.isOpen())
        {
            file.close();
        }
    }

    void renamed(QString new_name, QString old_name)
    {
        QDomElement elem_ren = xml_doc.createElement("renamed");
        QDomAttr att = xml_doc.createAttribute("time");
        att.setValue(QDateTime::currentDateTime().toString(Qt::ISODate));
        elem_ren.setAttributeNode(att);

        QDomText t = xml_doc.createTextNode(old_name + " -> " + new_name);
        elem_ren.appendChild(t);

        elem_renames.appendChild(elem_ren);
    }

private:
    QString path;

    // Version
    const quint32 version = 1;

    // Doc
    QDomDocument xml_doc;
    QDomElement root;

    // First root elements
    QDomElement elem_renames;
};

int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);

    TestDomClass *t = Q_NULLPTR; // <-- This line was in the for loop

    for(int a = 0; a < 10; ++a)
    {
        delete t;
        t = new TestDomClass("test_" + QString::number(a) + ".xml");
        for(int i = 0; i < 10; ++i)
        {
            qDebug() << "Round: " << i;
            t->renamed(QString::number(10*a + i), QString::number(10*a + 10-i));
        }
    }

    delete t;

    return a.exec();
}
#包括
#包括
#包括
#包括
#包括
#包括
类TestDomClass
{
公众:
TestDomClass(QString文件路径):
路径(文件路径)
{
xml_doc=QDomDocument(“数据_xml”);
root=xml_doc.createElement(“根”);
setAttribute(“版本”,QString::number(版本));
xml_doc.appendChild(根);
elem_renames=xml_doc.createElement(“重命名”);
根.appendChild(元素重命名);
}
~TestDomClass()
{
QFile文件(路径);
如果(!file.open(QIODevice::WriteOnly | QIODevice::Text))
{
//待办事项
qDebug()已解决!
我太笨了。我有一个这样的设置。我在for循环中声明并初始化了指向XML类的指针。因为我在下面的if语句中删除了旧的并创建了一个新的类,所以我第一次在if语句中初始化了指针,但第二次删除了它

#include <QCoreApplication>
#include <QDomDocument>
#include <QFile>
#include <QDateTime>
#include <QString>
#include <QDebug>

class TestDomClass
{
public:
    TestDomClass(QString file_path) :
        path(file_path)
    {
        xml_doc = QDomDocument("data_xml");
        root = xml_doc.createElement("root");
        root.setAttribute("version", QString::number(version));
        xml_doc.appendChild(root);

        elem_renames= xml_doc.createElement("renames");

        root.appendChild(elem_renames);
    }
    ~TestDomClass()
    {
        QFile file(path);
        if(!file.open(QIODevice::WriteOnly | QIODevice::Text))
        {
            // TODO
            qDebug() << "Failed to open file for writing!";
        }
        else
        {
            QTextStream stream(&file);
            stream << xml_doc.toString();
        }

        if(file.isOpen())
        {
            file.close();
        }
    }

    void renamed(QString new_name, QString old_name)
    {
        QDomElement elem_ren = xml_doc.createElement("renamed");
        QDomAttr att = xml_doc.createAttribute("time");
        att.setValue(QDateTime::currentDateTime().toString(Qt::ISODate));
        elem_ren.setAttributeNode(att);

        QDomText t = xml_doc.createTextNode(old_name + " -> " + new_name);
        elem_ren.appendChild(t);

        elem_renames.appendChild(elem_ren);
    }

private:
    QString path;

    // Version
    const quint32 version = 1;

    // Doc
    QDomDocument xml_doc;
    QDomElement root;

    // First root elements
    QDomElement elem_renames;
};

int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);

    TestDomClass *t = Q_NULLPTR; // <-- This line was in the for loop

    for(int a = 0; a < 10; ++a)
    {
        delete t;
        t = new TestDomClass("test_" + QString::number(a) + ".xml");
        for(int i = 0; i < 10; ++i)
        {
            qDebug() << "Round: " << i;
            t->renamed(QString::number(10*a + i), QString::number(10*a + 10-i));
        }
    }

    delete t;

    return a.exec();
}
#包括
#包括
#包括
#包括
#包括
#包括
类TestDomClass
{
公众:
TestDomClass(QString文件路径):
路径(文件路径)
{
xml_doc=QDomDocument(“数据_xml”);
root=xml_doc.createElement(“根”);
setAttribute(“版本”,QString::number(版本));
xml_doc.appendChild(根);
elem_renames=xml_doc.createElement(“重命名”);
根.appendChild(元素重命名);
}
~TestDomClass()
{
QFile文件(路径);
如果(!file.open(QIODevice::WriteOnly | QIODevice::Text))
{
//待办事项
qDebug()