Утечка памяти, связанная с replaceChild - PullRequest
2 голосов
/ 17 августа 2010

Вот исходный код моей функции:

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 ]

3 голосов
/ 17 августа 2010

Выглядит как ошибка QDom для меня (что меня не слишком удивит, просто отправил патч, чтобы " foo </ a:>" не падал QDom). Попробуйте с минимальным примером. Если это все еще утечка и если на Linux или OS X, вы можете запустить его в valgrind. И пример, и вывод valgrind могли бы стать хорошим отчетом об ошибке.

Редактировать: было бы интересно, если бы removeChild () также просочилась для вас

1 голос
/ 17 августа 2010

Документы говорят, что вызов возвращает ссылку на старый замененный узел в случае успеха:

Возвращает новую ссылку на oldChild в случае успеха или нулевой узел в случае сбоя.

Я не очень хорошо знаю QT, но я предполагаю, что предполагается, что вы очистите ссылку на старый узел?

...