[Development] Question about deferred delete handling in sendPostedEvents
Shaw Andy
Andy.Shaw at digia.com
Mon Feb 17 19:40:27 CET 2014
> > I was looking at a problem regarding deferred deletes causing a crash inside
> > nested loops and it was pointed out that in
> > QCoreApplication::setPostedEvents() there is some code there that
> > determines whether it is safe to delete the object or not. From my
> > understanding it will only delete an object if the loop level that it was
> > called from is greater than the current one. However it seems that if the
> > loop level is 0 (i.e. main event loop I guess) and the current one is
> > higher than 0 it deletes anyway, is this the correct intention? Does anyone
> > know why this is safe if so?
> >
> > For reference the code is this bit specifically:
> >
> > const bool allowDeferredDelete =
> > (loopLevel > data->loopLevel
> >
> > || (!loopLevel && data->loopLevel > 0)
> > || (event_type == QEvent::DeferredDelete
> >
> > && loopLevel == data->loopLevel));
> >
> > Where loopLevel is 0 but data->loopLevel is greater than 0.
>
> Loop level equal to 0 means the object was deleteLater'ed in main(), before
> exec(). That is, when no event loop was started. That means any event loop
> level can delete it.
>
> Otherwise, the object is only deleted if you're running a loop with equal or
> *lower* nesting level than when it was deleteLater'ed.
Aha, this does make a lot of sense, thanks this is very useful to know :)
Andy
More information about the Development
mailing list