XMLファイルを処理するためのクラスを作成しました。クラスは構築中のファイルをロードし、破壊時にファイルを保存します。クラスがアクティブな間、私は値を変更するいくつかのゲッターとセッター関数を持っています。そのうちの1つは、ファイルの名前の変更を記録する機能です。各呼び出しで、elem_renamesの新しい子要素が作成されます。2回目にQDomElementを作成する読み取りアクセス違反
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クラスを作成し、ファイルへの変更ごとにrename関数を呼び出します。しかし、私はこのエラーメッセージで私のプログラムがクラッシュする関数を呼び出します:
例外がスローされました:読み取りアクセス違反。 エラーは、関数の最初の行にスローされます。
なぜこのようなことが起こるのかわかりません。最初の呼び出しで作成された要素へのリンクがまだ存在するため、QDomElementをオーバーライドできないと思います。しかしどうですか?それは機能の終わりになくなっているはずです。
Visual Studio 2015とVisual Leak DetectorでQt 5.8を使用します。
ヘッダファイル:
// 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:私はテストプロジェクトを設定して、そこにそれが正常に動作します。私は問題をより詳細に調査しなければならない。