内存泄漏与replaceChild有关

时间:2010-08-17 10:23:24

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

以下是我的函数的源代码:

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时(我做了一些小改动)它没有增长。可能有什么问题?

感谢。

2 个答案:

答案 0 :(得分:3)

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

编辑:如果removeChild()也为你泄漏

会很有趣

答案 1 :(得分:1)

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

  

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

我不太了解QT,但我猜它会假设您要清理旧节点参考?