我编写了一个类来处理 XML 文件。该类在构建时加载文件,并在销毁时将其保存。当课程处于活动状态时,我有几个 getter 和 setter 函数来更改值。其中之一是记录一些文件重命名的功能。每次调用时,它都会为 elem_renames 创建一个新的子元素。
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 类并为文件的每次更改调用重命名函数。但是每次我调用该函数时,我的程序都会因以下错误消息而崩溃:
抛出异常:读取访问冲突。错误在函数的第一行抛出。
我不明白为什么会这样。我想我不能覆盖 QDomElement 因为仍然有一个链接到第一次调用时创建的元素。但是怎么做?它应该在函数结束时消失。
我将 Qt 5.8 与 Visual Studio 2015 和 Visual Leak Detector 一起使用。
头文件:
// 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:我已经建立了一个测试项目,它工作正常。我必须更详细地调查这个问题。