Fixed memory leak when connecting static functions 16/27116/1
authorPaul Wisbey <p.wisbey@samsung.com>
Wed, 3 Sep 2014 12:59:15 +0000 (13:59 +0100)
committerPaul Wisbey <p.wisbey@samsung.com>
Thu, 4 Sep 2014 14:16:33 +0000 (15:16 +0100)
[problem]     Callback object is leaked when not using ConnectionTracker e.g.
              when connecting static functions.
[cause]       Ownership of Callback was not taken (no SlotConnection created).
[solution]    Moved ownership to SignalConnection which is always created.

Change-Id: Ie828f58a72d6badab5a72f66af0e765c6fbe7434

dali/public-api/signals/signal-slot-connections.cpp
dali/public-api/signals/signal-slot-connections.h

index c74d3c9..ab22e09 100644 (file)
@@ -32,8 +32,6 @@ SlotConnection::SlotConnection( SlotObserver* slotObserver, CallbackBase* callba
 
 SlotConnection::~SlotConnection()
 {
-  // slot connections have ownership of the callback.
-  delete mCallback;
 }
 
 CallbackBase* SlotConnection::GetCallback()
@@ -60,6 +58,8 @@ SignalConnection::SignalConnection( SignalObserver* signalObserver, CallbackBase
 
 SignalConnection::~SignalConnection()
 {
+  // signal connections have ownership of the callback.
+  delete mCallback;
 }
 
 void SignalConnection::Disconnect( SlotObserver* slotObserver )
index f81f584..5c8c20a 100644 (file)
@@ -36,8 +36,7 @@ class CallbackBase;
  * - Callback (slot)
  * - SlotObserver -interface provided by the signal
  *
- * It takes ownership of the callback, and will delete it when
- * the connection is destroyed.
+ * It holds a pointer to the callback, but does not own it.
  */
 class SlotConnection
 {
@@ -47,7 +46,7 @@ public:
    * @brief Constructor.
    *
    * @param[in] slotObserver The slot observer.
-   * @param[in] callback Ownership of this callback object is taken.
+   * @param[in] callback A callback object (not owned).
    */
   SlotConnection(SlotObserver* slotObserver, CallbackBase* callback);
 
@@ -78,7 +77,7 @@ private:
 private:
 
   SlotObserver* mSlotObserver; ///< a pointer to the slot observer (not owned)
-  CallbackBase* mCallback;     ///< callback, has ownership
+  CallbackBase* mCallback;     ///< The callback. This is not owned, the corresponding SignalConnection has ownership.
 };
 
 /**
@@ -91,8 +90,8 @@ private:
  * - Callback (slot)
  * - SignalObserver - interface provided by a slot owning object.
  *
- * It holds a pointer to the callback, but does not own it.
- *
+ * It takes ownership of the callback, and will delete it when
+ * the connection is destroyed.
  */
 class SignalConnection
 {
@@ -109,7 +108,7 @@ public:
    * @brief Constructor.
    *
    * @param[in] signalObserver The signal observer.
-   * @param[in] callback The callback which should be a member function of the signalObserver.
+   * @param[in] callback Ownership of this callback object is taken.
    */
   SignalConnection( SignalObserver* signalObserver, CallbackBase* callback );
 
@@ -140,7 +139,7 @@ private:
 private:
 
   SignalObserver* mSignalObserver; ///< a pointer to the signal observer (not owned)
-  CallbackBase* mCallback;         ///< The callback. This is not owned, the corresponding SlotConnection has ownership.
+  CallbackBase* mCallback;         ///< The callback, has ownership.
 };
 
 } // namespace Dali