ecere/com/Map;gui/TabControl; extras: Fixed memory leaks
authorJerome St-Louis <jerome@ecere.com>
Sun, 15 Mar 2015 19:30:43 +0000 (15:30 -0400)
committerJerome St-Louis <jerome@ecere.com>
Sun, 15 Mar 2015 19:30:43 +0000 (15:30 -0400)
- Keys of Maps from Delete() and Free()
- TabControl when using AddTab
- GuiConfigData strings

ecere/src/com/containers/Map.ec
ecere/src/gui/controls/TabControl.ec
extras/gui/GuiConfigData.ec

index 13e1cdd..a510961 100644 (file)
@@ -125,9 +125,8 @@ public class Map<class MT, class V> : CustomAVLTree<MapNode<MT, V>, I = MT, D =
       }
    }
 
-   void Remove(MapNode<MT, V> node)
+   void FreeKey(MapNode<MT, V> node)
    {
-      CustomAVLTree::Remove(node);
       if(class(MT).type == structClass)
       {
          // TODO: Make this easier...
@@ -136,6 +135,12 @@ public class Map<class MT, class V> : CustomAVLTree<MapNode<MT, V>, I = MT, D =
       }
       else
          delete node.key;
+   }
+
+   void Remove(MapNode<MT, V> node)
+   {
+      CustomAVLTree::Remove(node);
+      FreeKey(node);
       delete node;
    }
 
@@ -161,6 +166,7 @@ public class Map<class MT, class V> : CustomAVLTree<MapNode<MT, V>, I = MT, D =
             MapNode<MT, V> parent = node.parent;
             V value = GetData(node);
             delete value;
+            FreeKey(node);
             delete node;
 
             node = parent;
@@ -174,6 +180,7 @@ public class Map<class MT, class V> : CustomAVLTree<MapNode<MT, V>, I = MT, D =
    {
       V value = GetData(node);
       delete value;
+      FreeKey(node);
       Remove(node);
    }
 
index e39553f..aa5dfa5 100644 (file)
@@ -595,7 +595,9 @@ public class TabControl : Window
       if(created)
       {
          tab.button.Create();
-         incref tab;
+         // This was causing leaks with RemoveTab / AddTab usage in Cartographer...
+         // RemoveTab() does not dec'ref...
+         // incref tab;
       }
 
       numTabs++;
index 3c3b60a..3e22df4 100644 (file)
@@ -121,6 +121,17 @@ private:
    ~GuiConfigData()
    {
       timer.Stop();
+
+      if(windows)
+      {
+         windows.Free();
+         delete windows;
+      }
+      if(paneSplitters)
+      {
+         paneSplitters.Free();
+         delete paneSplitters;
+      }
    }
 
    Timer timer