]> git.saurik.com Git - wxWidgets.git/blobdiff - src/common/cmdproc.cpp
fix memory leak in wxScreenDC, fixes #13249
[wxWidgets.git] / src / common / cmdproc.cpp
index 789e950f95abd09ef8ded525709314174572f54d..7de08c279063d0ab5ad45ff89b823c2d0b4d5c3b 100644 (file)
@@ -112,18 +112,6 @@ void wxCommandProcessor::Store(wxCommand *command)
 {
     wxCHECK_RET( command, wxT("no command in wxCommandProcessor::Store") );
 
 {
     wxCHECK_RET( command, wxT("no command in wxCommandProcessor::Store") );
 
-    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 )
-            m_lastSavedCommand = wxList::compatibility_iterator();
-    }
-
     // Correct a bug: we must chop off the current 'branch'
     // so that we're at the end of the command list.
     if (!m_currentCommand)
     // Correct a bug: we must chop off the current 'branch'
     // so that we're at the end of the command list.
     if (!m_currentCommand)
@@ -134,17 +122,31 @@ void wxCommandProcessor::Store(wxCommand *command)
         while (node)
         {
             wxList::compatibility_iterator next = node->GetNext();
         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
 
             // 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();
 
                 m_lastSavedCommand = wxList::compatibility_iterator();
 
+            delete (wxCommand *)node->GetData();
+            m_commands.Erase(node);
+
             node = next;
         }
     }
 
             node = next;
         }
     }
 
+    if ( (int)m_commands.GetCount() == m_maxNoCommands )
+    {
+        wxList::compatibility_iterator firstNode = m_commands.GetFirst();
+
+        // Make sure m_lastSavedCommand won't point to freed memory
+        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);
     m_currentCommand = m_commands.GetLast();
     SetMenuStrings();
     m_commands.Append(command);
     m_currentCommand = m_commands.GetLast();
     SetMenuStrings();
@@ -170,9 +172,9 @@ bool wxCommandProcessor::Redo()
 {
     wxCommand *redoCommand = NULL;
     wxList::compatibility_iterator redoNode
 {
     wxCommand *redoCommand = NULL;
     wxList::compatibility_iterator redoNode
-#if !wxUSE_STL
+#if !wxUSE_STD_CONTAINERS
         = NULL          // just to avoid warnings
         = NULL          // just to avoid warnings
-#endif // !wxUSE_STL
+#endif // !wxUSE_STD_CONTAINERS
         ;
 
     if ( m_currentCommand )
         ;
 
     if ( m_currentCommand )