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
This commit is contained in:
Vadim Zeitlin
2007-07-27 23:16:25 +00:00
parent 071691a05d
commit ef37a43194

View File

@@ -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