diff options
author | Liang Jian <[email protected]> | 2014-03-28 13:23:36 +0800 |
---|---|---|
committer | The Qt Project <[email protected]> | 2014-03-28 08:42:10 +0100 |
commit | 73b6dc26e8a128f93e53059f86f731d4b383fd60 (patch) | |
tree | 2a3bc049d84f686279cde12625617be1f9812ca5 /src/qml/jsruntime | |
parent | 2341b58b76aea5c627cc656a2406256bac710227 (diff) |
Fix QtSharedPointer::ExternalRefCountData object leak in v4 engine
Always call ~QObjectWrapper() to the wrapper object in
QObjectWrapper::destroy(), otherwise the m_object member of QObjectWrapper
may still hold a QtSharedPointer::ExternalRefCountData object which will
never been deleted.
I don't know why this will not cause leak in the past, but it seems that
the leak was introduced in 7ae796cb141b73a1b215b2b0fd64b7ffbbd1e510
Change-Id: I24b49bb11f95b7e3060c7adba1ab80b615da2942
Reviewed-by: Simon Hausmann <[email protected]>
Diffstat (limited to 'src/qml/jsruntime')
-rw-r--r-- | src/qml/jsruntime/qv4qobjectwrapper.cpp | 9 |
1 files changed, 5 insertions, 4 deletions
diff --git a/src/qml/jsruntime/qv4qobjectwrapper.cpp b/src/qml/jsruntime/qv4qobjectwrapper.cpp index 67801f39b7..f611be2965 100644 --- a/src/qml/jsruntime/qv4qobjectwrapper.cpp +++ b/src/qml/jsruntime/qv4qobjectwrapper.cpp @@ -1008,7 +1008,10 @@ namespace { void QObjectWrapper::destroy(Managed *that) { QObjectWrapper *This = static_cast<QObjectWrapper*>(that); - QPointer<QObject> &object = This->m_object; + QPointer<QObject> object = This->m_object; + ExecutionEngine *engine = This->engine(); + This->~QObjectWrapper(); + This = 0; if (!object) return; @@ -1020,9 +1023,7 @@ void QObjectWrapper::destroy(Managed *that) return; QObjectDeleter *deleter = new QObjectDeleter(object); - This->engine()->memoryManager->registerDeletable(deleter); - - This->~QObjectWrapper(); + engine->memoryManager->registerDeletable(deleter); } |