Я написал класс для обработки XML-файла. Класс загружает файл при построении и сохраняет его при уничтожении. Пока класс активен, у меня есть несколько функций получения и установки для изменения значений. Одна из них — функция регистрации некоторых переименований файлов. При каждом вызове он будет создавать новый дочерний элемент для 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: я настроил тестовый проект, и он работает нормально. Я должен изучить проблему более подробно.