From ef37a43194e06496cba74b1f0d0ab9eeefde4af7 Mon Sep 17 00:00:00 2001 From: Vadim Zeitlin Date: Fri, 27 Jul 2007 23:16:25 +0000 Subject: [PATCH] destroy TLW children pending for deletion from ~wxTLW to avoid leaving them with dangling parent pointer git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@47762 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775 --- src/common/toplvcmn.cpp | 33 +++++++++++++++++++++++++++++++-- 1 file changed, 31 insertions(+), 2 deletions(-) diff --git a/src/common/toplvcmn.cpp b/src/common/toplvcmn.cpp index 77cbec0582..4e501fa79d 100644 --- a/src/common/toplvcmn.cpp +++ b/src/common/toplvcmn.cpp @@ -59,7 +59,7 @@ wxTopLevelWindowBase::wxTopLevelWindowBase() { // Unlike windows, top level windows are created hidden by default. m_isShown = false; - m_winDefault = NULL; + m_winDefault = m_winTmpDefault = NULL; WX_INIT_CONTROL_CONTAINER(); @@ -67,7 +67,8 @@ wxTopLevelWindowBase::wxTopLevelWindowBase() wxTopLevelWindowBase::~wxTopLevelWindowBase() { - m_winDefault = m_winTmpDefault = NULL; + m_winDefault = + m_winTmpDefault = NULL; // don't let wxTheApp keep any stale pointers to us if ( wxTheApp && wxTheApp->GetTopWindow() == this ) @@ -75,6 +76,34 @@ wxTopLevelWindowBase::~wxTopLevelWindowBase() wxTopLevelWindows.DeleteObject(this); + // delete any our top level children which are still pending for deletion + // immediately: this could happen if a child (e.g. a temporary dialog + // created with this window as parent) was Destroy()'d) while this window + // was deleted directly (with delete, or maybe just because it was created + // on the stack) immediately afterwards and before the child TLW was really + // destroyed -- not destroying it now would leave it alive with a dangling + // parent pointer and result in a crash later + for ( wxObjectList::iterator i = wxPendingDelete.begin(); + i != wxPendingDelete.end(); + ) + { + wxWindow * const win = wxDynamicCast(*i, wxWindow); + if ( win && win->GetParent() == this ) + { + wxPendingDelete.erase(i); + + delete win; + + // deleting it invalidated the list (and not only one node because + // it could have resulted in deletion of other objects to) + i = wxPendingDelete.begin(); + } + else + { + ++i; + } + } + if ( IsLastBeforeExit() ) { // no other (important) windows left, quit the app -- 2.49.0