summaryrefslogtreecommitdiffstats
path: root/src/corelib/kernel/qmetaobject.cpp
diff options
context:
space:
mode:
authorThiago Macieira <thiago.macieira@intel.com>2017-12-24 15:37:04 -0200
committerOlivier Goffart (Woboq GmbH) <ogoffart@woboq.com>2018-01-14 22:36:20 +0000
commit57318ce8c2f2fbc8cbdf987fc7e2f661c9a2e688 (patch)
tree4bcff6e7c342f4eecfe3e2370aaac3fd1d638f5b /src/corelib/kernel/qmetaobject.cpp
parentec7652525499e87dfab574f21ff6553d5e8db12e (diff)
QMetaObject::invokeMethod: don't leak the slot object
QMetaCallEvent references up, so we need to drop by one. In all other cases, we need to drop the reference to zero and delete. [ChangeLog][QtCore][QMetaObject] Fixed a memory leak that happened when the new-style call to invokeMethod() was used. Task-number: QTBUG-65462 Change-Id: I39332e0a867442d58082fffd15034b99e31c92a1 Reviewed-by: Olivier Goffart (Woboq GmbH) <ogoffart@woboq.com>
Diffstat (limited to 'src/corelib/kernel/qmetaobject.cpp')
-rw-r--r--src/corelib/kernel/qmetaobject.cpp6
1 files changed, 6 insertions, 0 deletions
diff --git a/src/corelib/kernel/qmetaobject.cpp b/src/corelib/kernel/qmetaobject.cpp
index f07b463482..5c97bc6851 100644
--- a/src/corelib/kernel/qmetaobject.cpp
+++ b/src/corelib/kernel/qmetaobject.cpp
@@ -1491,6 +1491,12 @@ bool QMetaObject::invokeMethod(QObject *obj,
bool QMetaObject::invokeMethodImpl(QObject *object, QtPrivate::QSlotObjectBase *slot, Qt::ConnectionType type, void *ret)
{
+ struct Holder {
+ QtPrivate::QSlotObjectBase *obj;
+ ~Holder() { obj->destroyIfLastRef(); }
+ } holder = { slot };
+ Q_UNUSED(holder);
+
if (! object)
return false;