[Interest] Automatic deletion of children of QObject
jochen_becher at gmx.de
Tue Jun 12 21:36:46 CEST 2012
In my case childB is not a child of childA but both are children of
parent (widgets in the same group/layout). But childB has a reference to
childA which might be accessed in destructor. So I have either:
1) delete them in correct order (and I wouldn't like to create them in
unnatural oder just to enfore deletion in correct reverse order)
2) remove reference between objects before deleting them - I don't like
this way because parent's destructor has to know about all references
between child in that case.
I fixed it using my own QList of children which are deleted in reverse
order in parent's destructor...
Am Dienstag, den 12.06.2012, 11:49 -0700 schrieb Jason H:
> Yes, interally, IIRC it is a QList, and suffer/enjoys all the traits
> of such.
> And FWIW, I think deleting children inthe order they were added makes
> the most sense. If you need your backwards behavior you are really
> implying that B is a child of A, and if created as such, you would get
> the behavior you describe...
> From: Andreas Pakulat <apaku at gmx.de>
> To: Jochen Becher <jochen_becher at gmx.de>
> Cc: interest at qt-project.org
> Sent: Tuesday, June 12, 2012 2:45 PM
> Subject: Re: [Interest] Automatic deletion of children of QObject
> On Tue, Jun 12, 2012 at 8:37 PM, Jochen Becher <jochen_becher at gmx.de>
> Think of the following code:
> QObject *parent = new QObject();
> QObject *childA = new QObject(parent);
> QObject *childB = new QObject)parent);
> delete parent;
> In which order would you expect childA and childB gets
> deleted? I would
> expect childB first and childA second. This would be same
> behavior as in
> using normal variables:
> QObject parent;
> QObject childA(&parent);
> QObject childB(&parent);
> Here, on leaving the scope childB would be deleted first,
> childA second
> and parent last.
> Isn't it a bug in Qt to delete children in the same order
> there were
> added to a parent instead of the reverse order?
> No, Qt makes no such guarantees. In fact it doesn't guarantee any
> specific order of destruction for the children, if you rely on any
> order here, your code is buggy.
> Its also not possible to actually do this, since you can add/remove
> childs from the list during the runtime of the program and the QObject
> cannot know wether the last-added object is really the one to be
> destroyed first (in your ideal scenario) or wether its maybe the one
> created first but was removed and re-added later.
> Since QObject keeps an ordered list of its children, I think its
> reasonable that they simply run over it from beginning to end and
> destroy the childs instead of going through the extra hoop of running
> from end to beginning.
> Interest mailing list
> Interest at qt-project.org
More information about the Interest