What happens with QDomElement after its QDomDocument goes out of scope?
-
I am trying to understand whether the following code is fine or not:
#include <QApplication> #include <QDebug> #include <QDomDocument> #include <QDomElement> #include <QString> #include <QTextStream> void printIt(const QDomElement& element) { QString s; QTextStream str(&s); element.save(str, 4); qDebug() << s; } void fillIt(QDomElement& element) { QString content = " <book>" " <Title>MyBookTitle</Title>" " </book>"; QDomDocument doc; doc.setContent(content); element = doc.documentElement().firstChildElement(); printIt(element); } // doc goes out of scope here... int main(int argc, char* argv[]) { QApplication a(argc, argv); { QDomElement element; fillIt(element); printIt(element); // doc no longer exists, but is element still valid here // because the DOM tree still exists??? } // Both doc and element are deleted here, so DOM tree also gets deleted??? return 0; }My main question is whether
elementis still valid afterfillItreturns.At first, I thought that element could potentially contain rubbish, since its QDomDocument
docalready went out of scope and got destroyed, but in the documentation at http://doc.qt.io/qt-4.8/qdomdocument.html i read:The parsed XML is represented internally by a tree of objects that can be accessed using the various QDom classes. All QDom classes only reference objects in the internal tree. The internal objects in the DOM tree will get deleted once the last QDom object referencing them and the QDomDocument itself are deleted.
which makes me believe that
elementis still valid and the DOM tree still exists. My educated guess is thus that the code is well-defined and the DOM tree will only get deleted right before the return of main, when element goes out of scope.Am I right with my assumption? If not, an example showing where things can go wrong would be nice to have...
For the ones interested: the code example I'm testing with is online at https://github.com/BartVandewoestyne/Qt/tree/master/tests/qdomelement_test
-
I am trying to understand whether the following code is fine or not:
#include <QApplication> #include <QDebug> #include <QDomDocument> #include <QDomElement> #include <QString> #include <QTextStream> void printIt(const QDomElement& element) { QString s; QTextStream str(&s); element.save(str, 4); qDebug() << s; } void fillIt(QDomElement& element) { QString content = " <book>" " <Title>MyBookTitle</Title>" " </book>"; QDomDocument doc; doc.setContent(content); element = doc.documentElement().firstChildElement(); printIt(element); } // doc goes out of scope here... int main(int argc, char* argv[]) { QApplication a(argc, argv); { QDomElement element; fillIt(element); printIt(element); // doc no longer exists, but is element still valid here // because the DOM tree still exists??? } // Both doc and element are deleted here, so DOM tree also gets deleted??? return 0; }My main question is whether
elementis still valid afterfillItreturns.At first, I thought that element could potentially contain rubbish, since its QDomDocument
docalready went out of scope and got destroyed, but in the documentation at http://doc.qt.io/qt-4.8/qdomdocument.html i read:The parsed XML is represented internally by a tree of objects that can be accessed using the various QDom classes. All QDom classes only reference objects in the internal tree. The internal objects in the DOM tree will get deleted once the last QDom object referencing them and the QDomDocument itself are deleted.
which makes me believe that
elementis still valid and the DOM tree still exists. My educated guess is thus that the code is well-defined and the DOM tree will only get deleted right before the return of main, when element goes out of scope.Am I right with my assumption? If not, an example showing where things can go wrong would be nice to have...
For the ones interested: the code example I'm testing with is online at https://github.com/BartVandewoestyne/Qt/tree/master/tests/qdomelement_test
You declare your
elementvariable in the main function and you pass a reference to this variable to your method. Soelementis still valid after yourfillItmethod returns. -
You declare your
elementvariable in the main function and you pass a reference to this variable to your method. Soelementis still valid after yourfillItmethod returns.@the_ said:
You declare your
elementvariable in the main function and you pass a reference to this variable to your method. Soelementis still valid after yourfillItmethod returns.I might not have expressed myself well enough. When I wrote 'valid', I actually meant 'having the correct XML element content'. One could reason as follows (I'm not sure if this is the correct reasoning): since
docwent out of scope, the QDomDocument whereelementoriginally belonged to, no longer exists. That makes me wonder whetherelementnow contains/points_to rubbish/stuff_that_got_deleted or not. My test-program shows that it doesn't, but I am wondering if this is just a lucky shot or rather correct and intended behavior. -
@Bart_Vandewoestyne said:
QDomElement
HI
Since it stores it text as QStrings its pretty self contained so even
doc is deleted the text should still be valid.One should imagine
element = doc.documentElement() should point to invalid
node after, but Im wondering if a copy is made.One test could be fun though
http://doc.qt.io/qt-5/qdomnode.html#ownerDocument
Should return a null node. (isNull returns true) -
@Bart_Vandewoestyne said:
QDomElement
HI
Since it stores it text as QStrings its pretty self contained so even
doc is deleted the text should still be valid.One should imagine
element = doc.documentElement() should point to invalid
node after, but Im wondering if a copy is made.One test could be fun though
http://doc.qt.io/qt-5/qdomnode.html#ownerDocument
Should return a null node. (isNull returns true)This post is deleted!