aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorLiang Jian <jianliang79@gmail.com>2014-03-28 13:23:36 +0800
committerThe Qt Project <gerrit-noreply@qt-project.org>2014-03-28 08:42:10 +0100
commit73b6dc26e8a128f93e53059f86f731d4b383fd60 (patch)
tree2a3bc049d84f686279cde12625617be1f9812ca5
parent2341b58b76aea5c627cc656a2406256bac710227 (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 <simon.hausmann@digia.com>
-rw-r--r--src/qml/jsruntime/qv4qobjectwrapper.cpp9
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);
}