summaryrefslogtreecommitdiffstats
path: root/src/corelib/kernel
diff options
context:
space:
mode:
authorGiuseppe D'Angelo <giuseppe.dangelo@kdab.com>2012-12-17 00:28:44 +0100
committerThe Qt Project <gerrit-noreply@qt-project.org>2012-12-17 19:50:33 +0100
commitcc89509f831111aadf869b1065ec1ae01f6759b8 (patch)
tree9fb2f6bea8bccd903ec6a9f1ecba2b11f0feaa9f /src/corelib/kernel
parentc4f433d581e2d609d2eaecc4e4b999a469950eb3 (diff)
Delete the QSlotObject when disconnect()ing
When disconnect()ing through a QMetaObject::Connection, if the QObjectPrivate::Connection contains a slot object, deref it, so that it will be destroyed before the next run of cleanConnectionList. Previously, a copy of the functor passed to connect() was kept until QObjectPrivate::cleanConnectionLists was called (by adding a new signal, or the sender was destroyed), even after a successful call to disconnect(). That is, we were keeping that copy allocated without any good reason. Change-Id: Ie6074ea797df1611cb995dec07c5b5a742360833 Reviewed-by: Olivier Goffart <ogoffart@woboq.com>
Diffstat (limited to 'src/corelib/kernel')
-rw-r--r--src/corelib/kernel/qobject.cpp6
1 files changed, 6 insertions, 0 deletions
diff --git a/src/corelib/kernel/qobject.cpp b/src/corelib/kernel/qobject.cpp
index 20c634ad78..9091b5579e 100644
--- a/src/corelib/kernel/qobject.cpp
+++ b/src/corelib/kernel/qobject.cpp
@@ -4294,6 +4294,12 @@ bool QObject::disconnect(const QMetaObject::Connection &connection)
c->next->prev = c->prev;
c->receiver = 0;
+ // destroy the QSlotObject, if possible
+ if (c->isSlotObject) {
+ c->slotObj->destroyIfLastRef();
+ c->isSlotObject = false;
+ }
+
const_cast<QMetaObject::Connection &>(connection).d_ptr = 0;
c->deref(); // has been removed from the QMetaObject::Connection object