]> git.saurik.com Git - wxWidgets.git/commitdiff
Destroy the wxDialog::ShowWindowModalThenDo() functor a.s.a.p.
authorVáclav Slavík <vslavik@fastmail.fm>
Tue, 1 Oct 2013 12:19:56 +0000 (12:19 +0000)
committerVáclav Slavík <vslavik@fastmail.fm>
Tue, 1 Oct 2013 12:19:56 +0000 (12:19 +0000)
Previously, the functor was kept in a helper event handler that was bound to
wxEVT_WINDOW_MODAL_DIALOG_CLOSED and only marked as already called, but never
unbound. Consequently, the functor object remained allocated for as long as the
event table existed and was only freed with the dialog instance.

Change the logic to destroy the functor object as soon as it was called and is
no longer needed for anything.

This is particularly important when used with C++11 lambdas that capture the
dialog in a wxWindowPtr pointer, because the pointer would be retained forever
otherwise.

git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@74890 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775

include/wx/dialog.h

index e32cabb018e97a24b1249abb1fdfbb3b249e0944..57582708c67129d13682b50a53720761d379ab6c 100644 (file)
@@ -13,6 +13,7 @@
 
 #include "wx/toplevel.h"
 #include "wx/containr.h"
+#include "wx/sharedptr.h"
 
 class WXDLLIMPEXP_FWD_CORE wxSizer;
 class WXDLLIMPEXP_FWD_CORE wxStdDialogButtonSizer;
@@ -402,24 +403,29 @@ class wxWindowModalDialogEventFunctor
 {
 public:
     wxWindowModalDialogEventFunctor(const Functor& f)
-        : m_f(f), m_wasCalled(false)
+        : m_f(new Functor(f))
     {}
 
     void operator()(wxWindowModalDialogEvent& event)
     {
-        if ( m_wasCalled )
+        if ( m_f )
+        {
+            // We only want to call this handler once. Also, by deleting
+            // the functor here, its data (such as wxWindowPtr pointing to
+            // the dialog) are freed immediately after exiting this operator().
+            wxSharedPtr<Functor> functor(m_f);
+            m_f.reset();
+
+            (*functor)(event.GetReturnCode());
+        }
+        else // was already called once
         {
             event.Skip();
-            return;
         }
-
-        m_wasCalled = true;
-        m_f(event.GetReturnCode());
     }
 
 private:
-    Functor m_f;
-    bool m_wasCalled;
+    wxSharedPtr<Functor> m_f;
 };
 
 template<typename Functor>