zoukankan      html  css  js  c++  java
  • 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~

  • 相关阅读:
    Android Lint简介
    免费HTTP数据抓包Fiddler2[4.6.1.2]以及显示中文包内容的方法
    IE6、7下bug
    图表插件
    学习:使用svg
    jQuery Transit
    jQuery基础学习笔记(1)
    HTTP协议详解学习
    html5学习笔记
    html释疑
  • 原文地址:https://www.cnblogs.com/wenshanzh/p/3470261.html
Copyright © 2011-2022 走看看