From 73b6dc26e8a128f93e53059f86f731d4b383fd60 Mon Sep 17 00:00:00 2001 From: Liang Jian Date: Fri, 28 Mar 2014 13:23:36 +0800 Subject: 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 --- src/qml/jsruntime/qv4qobjectwrapper.cpp | 9 +++++---- 1 file 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(that); - QPointer &object = This->m_object; + QPointer 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); } -- cgit v1.2.3