【问题标题】:Memory Leak related with replaceChild与 replaceChild 相关的内存泄漏
【发布时间】:2010-08-17 10:23:23
【问题描述】:

这是我的函数的源代码:

bool FieldModel::updateNode(QDomNode &node,const QString &parent){

  QDomElement rootOfTag;

  rootOfTag=fieldState.firstChild().firstChildElement(parent);

  qDebug()<<"Before"<<fieldState.toString();
  QDomNodeList sameTags=rootOfTag.elementsByTagName(node.firstChild().toElement().tagName());
  for(uint i=0;i<sameTags.length();i++){
      QDomNode nodeToReplace=sameTags.item(i);
      if(nodeToReplace.toElement().attribute("id")==node.firstChild().toElement().attribute("id")){
        nodeToReplace.parentNode().replaceChild(node,nodeToReplace);//Cause Memory Leak
        qDebug()<<"After"<<fieldState.toString();
        return true;
      }
  }

insertNode(node,parent);
return true;
}

我的程序的内存使用量严格增加,但是当我删除nodeToReplace.parentNode().replaceChild(node,nodeToReplace); 行时,程序使用稳定的内存量。 我监控了fieldState(QDomDocument),但在我使用replaceChild 时它没有增长(我做了一些小改动)。有什么问题?

谢谢。

【问题讨论】:

    标签: c++ xml debugging qt memory-leaks


    【解决方案1】:

    对我来说看起来像是一个 QDom 错误(这不会让我太惊讶,只是提交了一个补丁以使“foo”不会导致 QDom 崩溃)。尝试一个最小的例子。如果仍然泄漏并且在 Linux 或 OS X 上,您可以在 valgrind 中运行它。示例和 valgrind 的输出都会生成一个很好的错误报告。

    编辑:如果 removeChild() 也为您泄漏会很有趣

    【讨论】:

      【解决方案2】:

      The docs 表示调用成功时返回对旧的替换节点的引用:

      成功时返回对 oldChild 的新引用,失败时返回空节点。

      我不太了解 QT,但我猜它假设你会清理旧的节点引用?

      【讨论】:

      • 不,使用这些类不需要内存管理。如果有内存泄漏,那是 QDom 中的一个错误。
      • @Frank:如果replaceChild 返回对旧孩子的引用,那么此时显然不会删除内存。我在QDomDocument 中看到了一点,它说当最后一个引用 dom 文档都消失时,节点的内存被破坏了。因此,似乎在 QDomDocument 被销毁之前,旧节点仍将继续存在(即使不再引用它们)。
      • @Troubadour: 签名是 QDomNode QDomNode::replaceChild ( const QDomNode & newChild, const QDomNode & oldChild ) 所以QDom用户没有什么要释放的,该方法返回一个副本(尽管内部共享)。我希望父级从其子级中删除 oldChild 而不是保留对当时删除的子节点的引用。这对我来说没有意义,而且我看不到其他方法可以显式释放节点。
      • 通过引用游吟诗人的话,我尝试了 fieldstate.setContent(fieldState.toString()),它解决了我的问题:),但它看起来效率很低:(
      猜你喜欢
      • 2010-11-19
      • 2013-09-27
      • 1970-01-01
      • 2013-01-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-05-18
      相关资源
      最近更新 更多