From: Vadim Zeitlin Date: Sun, 28 Nov 2010 15:14:49 +0000 (+0000) Subject: Don't compare invalid iterators in wxCommandProcessor code. X-Git-Url: https://git.saurik.com/wxWidgets.git/commitdiff_plain/7e0b0eb38fadc78f7a92404e604420ab49158292 Don't compare invalid iterators in wxCommandProcessor code. Comparing invalid iterators results in an assert failure in STL build. We might also change wxList::compatibility_iterator::operator==() to allow comparing invalid iterators (which should be different from all the other ones but what about comparing two invalid iterators?) but it would probably be better to get rid of all uses of compatibility_iterator in the code instead in the long term. Closes #12730. git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@66287 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775 --- diff --git a/src/common/cmdproc.cpp b/src/common/cmdproc.cpp index 3d3d024abf..cb0d393049 100644 --- a/src/common/cmdproc.cpp +++ b/src/common/cmdproc.cpp @@ -122,13 +122,14 @@ void wxCommandProcessor::Store(wxCommand *command) while (node) { wxList::compatibility_iterator next = node->GetNext(); - delete (wxCommand *)node->GetData(); - m_commands.Erase(node); // Make sure m_lastSavedCommand won't point to freed memory - if ( m_lastSavedCommand == node ) + if ( m_lastSavedCommand && m_lastSavedCommand == node ) m_lastSavedCommand = wxList::compatibility_iterator(); + delete (wxCommand *)node->GetData(); + m_commands.Erase(node); + node = next; } } @@ -136,13 +137,14 @@ void wxCommandProcessor::Store(wxCommand *command) if ( (int)m_commands.GetCount() == m_maxNoCommands ) { wxList::compatibility_iterator firstNode = m_commands.GetFirst(); - wxCommand *firstCommand = (wxCommand *)firstNode->GetData(); - delete firstCommand; - m_commands.Erase(firstNode); // Make sure m_lastSavedCommand won't point to freed memory - if ( m_lastSavedCommand == firstNode ) + if ( m_lastSavedCommand && m_lastSavedCommand == firstNode ) m_lastSavedCommand = wxList::compatibility_iterator(); + + wxCommand *firstCommand = (wxCommand *)firstNode->GetData(); + delete firstCommand; + m_commands.Erase(firstNode); } m_commands.Append(command);