]> git.saurik.com Git - wxWidgets.git/commitdiff
Don't compare invalid iterators in wxCommandProcessor code.
authorVadim Zeitlin <vadim@wxwidgets.org>
Sun, 28 Nov 2010 15:14:49 +0000 (15:14 +0000)
committerVadim Zeitlin <vadim@wxwidgets.org>
Sun, 28 Nov 2010 15:14:49 +0000 (15:14 +0000)
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

src/common/cmdproc.cpp

index 3d3d024abf2026c5e8c9b878ea5b1483747f11a0..cb0d3930492d76aab84dcfe90402aad227bdf875 100644 (file)
@@ -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);