QDomDocument Access violation writing location

今天犯了一个非常2的错误!

 为了将面板参数保存起来,选择用QDomDocument构造Dom树,然后用doc.toString()方法返回符合xml格式的QString。如:

QString CutFaceFilter::saveParamsXML(CutFaceParams& para)
{
    QDomDocument doc;    

    QDomElement root = doc.createElement("parameters");
    doc.appendChild(root);

    QDomElement element1 = doc.createElement("para");
    element1.setAttribute("name", "center");
    element1.setAttribute("x", para.center[0]);
    element1.setAttribute("y", para.center[1]);
    element1.setAttribute("z", para.center[2]);
    root.appendChild(element1);

    QDomElement element2 = doc.createElement("para");
    element2.setAttribute("name", "normal");
    element2.setAttribute("x", para.normal[0]);
    element2.setAttribute("y", para.normal[1]);
    element2.setAttribute("z", para.normal[2]);
    root.appendChild(element2);

    return doc.toString();
}

此方法在本地运行正常,但将其封装导出为一个DLL文件,再次调用时,一直报错:“Access violation writing location”。跟踪代码,发现出了这个函数,在return后就会报错,即使将这个doc.toString()拷贝出来,甚至使用QString的deep copy:

  QString str(doc.toString().toLocal8Bit ());
  return str;

仍报错这个错。Google了好久,也没发现原因。

  JL之前说QDomElement递归调用时会各种出错,于是感觉是否QDomDocument这个方法不靠谱。。。

(1) 换用QxmlStreamWriter, 直接返回时,是bad prt,用QString 的deep copy后,可以得到正确的结果。但换用这个方法,工程中用到QDomDocument的地方都要改,改动太大,太麻烦。

(2) 继续搜,猛然发现一帖,说也在使用QDom时出现了violation的问题,结果是由于引用的lib不是Debug版的QtXmld4.lib。而是QtXml4.lib。 醍醐灌顶,一查我的工程,果然也是这个lib错写成Release版的了。改为QtXmld4.lib后,问题得解!!

   这个错误太2了,以后吸取教训,出现violation错误时, 要记得看看是否是导入的lib库Debug 、Release搞混了。Mark~

posted on 2013-12-11 22:54  没有什么能够阻挡  阅读(610)  评论(0编辑  收藏  举报

导航