[Development] [QML] Singletons are deleted before the other objects

Simon Hausmann simon.hausmann at digia.com
Mon Sep 22 10:56:58 CEST 2014


On Monday 22. September 2014 01.33.14 BogDan wrote:
> On Monday 22. September 2014 01.19.17 BogDan wrote:
> > Hi Simon,
> > 
> > I took a look and I'm pretty sure I'm right ;-). BTW I'm using 5.4
> > branch (sha1 f9ee33f96), is a little  bit old, but I bet nobody
> > fixed it. The same problem is in previous releases.
> > 
> > So, the singletons are deleted in QQmlEngine::~QQmlEngine():910
> > The other active objects are deleted in  MemoryManager::sweep(*true*)
> > which is called by MemoryManager::~MemoryManager()
> > which is called by ExecutionEngine::~ExecutionEngine()
> > which is called by QV8Engine::~QV8Engine()
> > which is called by QJSEngine::~QJSEngine()
> > which is called *after* QQmlEngine::~QQmlEngine()
> > 
> > Check the call-stack:
> > 0   MyObject::~MyObject myobject.cpp    44  0x7fffd141eb4b
> > 1   MyObject::~MyObject myobject.cpp    46  0x7fffd141ec8a
> > 2   (anonymous namespace)::QObjectDeleter::~QObjectDeleter
> > qv4qobjectwrapper.cpp   1018    0x7ffff5f79ee1  f9ee33f96f9ee33f96 3
> > (anonymous namespace)::QObjectDeleter::~QObjectDeleter
> > qv4qobjectwrapper.cpp   1021    0x7ffff5f79f2e 4
> > QV4::MemoryManager::sweep   qv4mm.cpp   377 0x7ffff5efd080
> > 5   QV4::MemoryManager::~MemoryManager  qv4mm.cpp   515 0x7ffff5efda18
> > 6   QV4::ExecutionEngine::~ExecutionEngine  qv4engine.cpp   421
> > 0x7ffff5ee4f54 7   QV8Engine::~QV8Engine   qv8engine.cpp   116
> > 0x7ffff606b7f2
> > 8   QV8Engine::~QV8Engine   qv8engine.cpp   117 0x7ffff606b87e
> > 9   QJSEngine::~QJSEngine   qjsengine.cpp   203 0x7ffff5e64b1e
> > 10  QQmlEngine::~QQmlEngine qqmlengine.cpp  893 0x7ffff5fb0b5d
> > 11  QQmlEngine::~QQmlEngine qqmlengine.cpp  916 0x7ffff5fb0b8c
> > 12  QObjectPrivate::deleteChildren  qobject.cpp 1943    0x7ffff599efd0
> > 13  QObject::~QObject   qobject.cpp 1034    0x7ffff599d760
> > 14  QWindow::~QWindow   qwindow.cpp 210 0x7ffff63f5bdc
> > 15  QQuickWindow::~QQuickWindow qquickwindow.cpp    1099    0x7ffff6bc0353
> > 16  QQuickView::~QQuickView qquickview.cpp  220 0x7ffff6c9fe35
> > 17  main    main.cpp    12  0x4021fb
> > 
> > IMHO the sequence from QQmlEngine::~QQmlEngine():910 should be moved
> > after/in MemoryManager::~MemoryManager ...
> 
> Ahh, so what you're talking about are the _JavaScript_ wrappers for the
> singletons, not the singleton objects themselves. That explains the
> confusion.
> 
> Yes, due to the inheritance the final garbage collection runs as the very
> last step - and it has to, conceptually. I'm wondering: What code do you
> have running at that point that gets still called? Is it code in C++
> destructors?
> 
> 
> 
> 
> 
> 
> Yes, the code from their destructors needs the singletons objects which are
> not available anymore.

When are those destructors called?

We need a little bit more information here, because it isn't obvious how to 
solve this. There's naturally a pool of objects around that haven't been 
garbage collected. On engine shutdown the garbage collector sweeps them all, 
and there's naturally no way to define an order of destruction if you think of 
such an environment.


Simon



More information about the Development mailing list