2010-08-17 4 views
2

Вот исходный код моей функции:Утечка памяти, связанные с 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 (делаю небольшие изменения). Что может быть проблемой?

Спасибо.

ответ

1

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

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

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

+2

Нет, нет управления памятью не требуется использования этих классов. Если происходит утечка памяти, это ошибка в QDom. –

+1

@Frank: Если 'replaceChild' возвращает ссылку на старый дочерний элемент, тогда память явно не удаляется в этой точке. Я вижу бит в ['QDomDocument'] (http://doc.trolltech.com/4.6/qdomdocument.html#details), в котором говорится, что память для узла уничтожается, когда последняя ссылка _and_ документа dom уходит , Похоже, что до тех пор, пока «QDomDocument» не будет уничтожен, старые узлы все равно будут биться (даже на них больше нет ссылок). – Troubadour

+0

@Troubadour: Подпись QDomNode QDomNode :: replaceChild (Const QDomNode & newChild, Const QDomNode & oldChild) Таким образом, нет ничего, чтобы освободить пользователем QDom, метод возвращает копию (хотя внутренне совместно). Я ожидаю, что родительский элемент удалит oldChild из своих дочерних элементов и не будет содержать ссылку на удаленный дочерний узел. Это не имеет смысла для меня, и я не вижу способа явно освободить узел в противном случае. –

3

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

Edit: Было бы интересно, если RemoveChild() также утечки для вас

Смежные вопросы