crash fix: when __ClearReserveDeleteWindowList() was destroying Windows, some might have pushed it's children for deletion to m_ReserveDeleteWindowList, invalidating iterators

This commit is contained in:
d1str4ught
2026-02-09 02:25:35 +01:00
parent de25f437ed
commit 6dfb708888
2 changed files with 47 additions and 41 deletions

View File

@@ -75,6 +75,7 @@ namespace UI
void CWindowManager::Destroy()
{
__ClearReserveDeleteWindowList();
#ifdef __WINDOW_LEAK_CHECK__
std::set<CWindow*>::iterator i;
for (i=gs_kSet_pkWnd.begin(); i!=gs_kSet_pkWnd.end(); ++i)
@@ -430,7 +431,7 @@ namespace UI
pParentWin->DeleteChild(pWin);
}
pWin->Clear();
m_ReserveDeleteWindowList.push_back(pWin);
m_ReserveDeleteWindowList.insert(pWin);
}
BOOL CWindowManager::IsDragging()
@@ -710,17 +711,21 @@ namespace UI
void CWindowManager::__ClearReserveDeleteWindowList()
{
for (TWindowContainer::iterator itor = m_ReserveDeleteWindowList.begin(); itor != m_ReserveDeleteWindowList.end(); ++itor)
{
CWindow * pWin = *itor;
#ifdef __WINDOW_LEAK_CHECK__
gs_kSet_pkWnd.erase(pWin);
#endif
delete pWin;
}
m_ReserveDeleteWindowList.clear();
if (m_ReserveDeleteWindowList.empty())
return;
}
std::unordered_set<CWindow*> tmp;
do {
tmp.swap(m_ReserveDeleteWindowList);
for (CWindow* pWin : tmp) {
#ifdef __WINDOW_LEAK_CHECK__
gs_kSet_pkWnd.erase(pWin);
#endif
delete pWin;
}
tmp.clear();
} while (!m_ReserveDeleteWindowList.empty());
}
void CWindowManager::Update()
{