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:
@@ -59,7 +59,7 @@ wxTopLevelWindowBase::wxTopLevelWindowBase()
|
|||||||
{
|
{
|
||||||
// Unlike windows, top level windows are created hidden by default.
|
// Unlike windows, top level windows are created hidden by default.
|
||||||
m_isShown = false;
|
m_isShown = false;
|
||||||
m_winDefault = NULL;
|
m_winDefault =
|
||||||
m_winTmpDefault = NULL;
|
m_winTmpDefault = NULL;
|
||||||
|
|
||||||
WX_INIT_CONTROL_CONTAINER();
|
WX_INIT_CONTROL_CONTAINER();
|
||||||
@@ -67,7 +67,8 @@ wxTopLevelWindowBase::wxTopLevelWindowBase()
|
|||||||
|
|
||||||
wxTopLevelWindowBase::~wxTopLevelWindowBase()
|
wxTopLevelWindowBase::~wxTopLevelWindowBase()
|
||||||
{
|
{
|
||||||
m_winDefault = m_winTmpDefault = NULL;
|
m_winDefault =
|
||||||
|
m_winTmpDefault = NULL;
|
||||||
|
|
||||||
// don't let wxTheApp keep any stale pointers to us
|
// don't let wxTheApp keep any stale pointers to us
|
||||||
if ( wxTheApp && wxTheApp->GetTopWindow() == this )
|
if ( wxTheApp && wxTheApp->GetTopWindow() == this )
|
||||||
@@ -75,6 +76,34 @@ wxTopLevelWindowBase::~wxTopLevelWindowBase()
|
|||||||
|
|
||||||
wxTopLevelWindows.DeleteObject(this);
|
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() )
|
if ( IsLastBeforeExit() )
|
||||||
{
|
{
|
||||||
// no other (important) windows left, quit the app
|
// no other (important) windows left, quit the app
|
||||||
|
Reference in New Issue
Block a user