wxTopLevelWindowBase::~wxTopLevelWindowBase() { // don't let wxTheApp keep any stale pointers to us if ( wxTheApp && wxTheApp->GetTopWindow() == this ) wxTheApp->SetTopWindow(NULL); bool shouldExit = IsLastBeforeExit(); wxTopLevelWindows.DeleteObject(this); if ( shouldExit ) { // then do it wxTheApp->ExitMainLoop(); } }
wxTopLevelWindowBase::~wxTopLevelWindowBase() { // don't let wxTheApp keep any stale pointers to us if ( wxTheApp && wxTheApp->GetTopWindow() == this ) wxTheApp->SetTopWindow(NULL); 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 wxTheApp->ExitMainLoop(); } }
MyChild::~MyChild() { if ( IsLastBeforeExit() ) PostQuitMessage(0); }