QDomElement.setAttribute 使程序崩溃

Posted

技术标签:

【中文标题】QDomElement.setAttribute 使程序崩溃【英文标题】:QDomElement.setAttribute crashes program 【发布时间】:2013-04-13 09:50:20 【问题描述】:

这令人困惑。我的程序运行可靠。然后,我匆忙做了一些更改,它们不起作用,重新缠绕它们,去展示我的程序,它不再起作用了。我没有每 10 分钟制作一次新副本是我的错。然而问题是,程序在一个毫无意义的地方崩溃了。

QDomElement Expense::toNode()

    QDomElement e=Entry::toNode(); //Entry is parent of Expense
    QString temp;
    //std::string getThis=e.nodeName().toStdString();
    temp=QString::fromStdString(Category); //Category is string field

    //e.hasAttribute("category"); //this works
    //e.setAttribute("ha","hi"); //this crashes program
    //e.setAttribute("category",temp); //this also crashes program
    return e;

我想可能是匆忙修改了一些库,但是如果我创建一个新的QDomElement,并编辑它的属性,则完全没有问题。然后我想也许我的节点根本不是节点,但我可以使用许多其他功能(例如e.hasAttribute)。我们可以设置的属性数量是否有限制?可能是什么错误?

如果有帮助:

QDomElement Entry::toNode()

    QDomDocument d("EzXpns");
    QDomElement e=d.createElement("entry");
    QString temp;
    temp=QString::fromStdString(Name);
    e.setAttribute("name",temp);
    temp=QString::fromStdString(to_string(static_cast<long double>(Amount)));
    e.setAttribute("amount",temp);
    temp=QString::fromStdString(to_string(static_cast<long long>(Date[0])));
    e.setAttribute("dateyear",temp);
    temp=QString::fromStdString(to_string(static_cast<long long>(Date[1])));
    e.setAttribute("datemonth",temp);
    temp=QString::fromStdString(to_string(static_cast<long long>(Date[2])));
    e.setAttribute("dateday",temp);
    temp=QString::fromStdString(Comment);
    e.setAttribute("comment",temp);
    return e;

编辑:我应该指定,如果我尝试调试,这是我得到的消息:

TestBuild.exe 已触发断点

然后

TestBuild.exe 中 0x77d415de 处未处理的异常:0xC0000005:访问冲突读取位置 0x13fb8ff8。

然后

TestBuild.exe中的0x77d3016e:0x00000000:操作成功完成。

Edit2:示例 xml

<!DOCTYPE data>
<EzXpns>
  <account>
    <login name="b" password="1"/>
    <expHis>
      <entry comment="9" dateday="1" name="k" dateyear="0" amount="9" datemonth="1"/>
      <entry comment="9" dateday="1" name="b" dateyear="0" amount="9" datemonth="1"/>
      <entry comment="9" dateday="1" name="b" dateyear="0" amount="9" datemonth="1"/>
      <entry comment="9" dateday="1" name="b" dateyear="0" amount="9" datemonth="1"/>
      <entry comment="9" dateday="1" name="b" dateyear="0" amount="9" datemonth="1"/>
    </expHis>
    <incomeHis/>
  </account>
</EzXpns>

【问题讨论】:

【参考方案1】:

解决方案在 Qt 文档中。

看看我是如何创建新元素的,我是通过调用 QDomDocument d("EzXpns"); 来实现的,这是一个错误。在 Qt 中,QDomDocument 被销毁后,所有子节点都是如此。它以前只是因为纯粹的运气而起作用。创建一个QDomDocument,然后传递它,解决了我的问题。

【讨论】:

以上是关于QDomElement.setAttribute 使程序崩溃的主要内容,如果未能解决你的问题,请参考以下文章