Вот исходный код моей функции:Утечка памяти, связанные с replaceChild
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
(делаю небольшие изменения). Что может быть проблемой?
Спасибо.
Нет, нет управления памятью не требуется использования этих классов. Если происходит утечка памяти, это ошибка в QDom. –
@Frank: Если 'replaceChild' возвращает ссылку на старый дочерний элемент, тогда память явно не удаляется в этой точке. Я вижу бит в ['QDomDocument'] (http://doc.trolltech.com/4.6/qdomdocument.html#details), в котором говорится, что память для узла уничтожается, когда последняя ссылка _and_ документа dom уходит , Похоже, что до тех пор, пока «QDomDocument» не будет уничтожен, старые узлы все равно будут биться (даже на них больше нет ссылок). – Troubadour
@Troubadour: Подпись QDomNode QDomNode :: replaceChild (Const QDomNode & newChild, Const QDomNode & oldChild) Таким образом, нет ничего, чтобы освободить пользователем QDom, метод возвращает копию (хотя внутренне совместно). Я ожидаю, что родительский элемент удалит oldChild из своих дочерних элементов и не будет содержать ссылку на удаленный дочерний узел. Это не имеет смысла для меня, и я не вижу способа явно освободить узел в противном случае. –