From 379fd2f2a9567082e964981d6e70f9444299b7d7 Mon Sep 17 00:00:00 2001
From: Christophe Geuzaine <cgeuzaine@ulg.ac.be>
Date: Wed, 19 Feb 2014 20:09:57 +0000
Subject: [PATCH] fix memory leak (patch from Cosmin Stefan Deaconu: thanks!)

---
 Common/TreeUtils.cpp |  7 +++++++
 Common/TreeUtils.h   |  1 +
 Geo/findLinks.cpp    | 12 ++++++++++--
 3 files changed, 18 insertions(+), 2 deletions(-)

diff --git a/Common/TreeUtils.cpp b/Common/TreeUtils.cpp
index 1521270dcd..f59fe4eeeb 100644
--- a/Common/TreeUtils.cpp
+++ b/Common/TreeUtils.cpp
@@ -27,6 +27,13 @@ void Tree_Delete(Tree_T * tree)
   Free(tree);
 }
 
+void Tree_Delete(Tree_T * tree, void (*freefn) (void * ))
+{
+  if(!tree) return;
+  avl_free_table(tree->root, freefn, 0);
+  Free(tree);
+}
+
 void *Tree_Add(Tree_T * tree, void *data)
 {
   if(!tree) return 0;
diff --git a/Common/TreeUtils.h b/Common/TreeUtils.h
index 7dd9526b60..e76b57a395 100644
--- a/Common/TreeUtils.h
+++ b/Common/TreeUtils.h
@@ -16,6 +16,7 @@ typedef struct {
 
 Tree_T *Tree_Create(int size, int (*fcmp)(const void *a, const void *b));
 void    Tree_Delete(Tree_T *Tree);
+void    Tree_Delete(Tree_T *Tree, void (*freefn)(void * ) );
 void   *Tree_Add(Tree_T *tree, void *data);
 int     Tree_Nbr(Tree_T *Tree);
 int     Tree_Insert(Tree_T *Tree, void *data);
diff --git a/Geo/findLinks.cpp b/Geo/findLinks.cpp
index 9b4213e23b..8f1973f8d7 100644
--- a/Geo/findLinks.cpp
+++ b/Geo/findLinks.cpp
@@ -5,6 +5,7 @@
 
 #include <stdlib.h>
 #include "GmshMessage.h"
+#include "MallocUtils.h"
 #include "GModel.h"
 #include "TreeUtils.h"
 #include "ListUtils.h"
@@ -18,6 +19,13 @@ typedef struct{
   List_T *l;
 }lnk;
 
+
+static void freeLink(void * link)
+{
+  List_Delete(((lnk*) link)->l); 
+  Free(link); 
+}
+
 static int complink(const void *a, const void *b)
 {
   lnk *q = (lnk*)a;
@@ -193,7 +201,7 @@ int allEdgesLinked(int ed, List_T *edges)
     orientAndSortEdges(edges, links);
   }
 
-  Tree_Delete(links);
+  Tree_Delete(links, freeLink);
   Tree_Delete(points);
 
   return found;
@@ -305,7 +313,7 @@ int allFacesLinked(int fac, List_T *faces)
     // necessary...
   }
 
-  Tree_Delete(links);
+  Tree_Delete(links,freeLink);
   Tree_Delete(edges);
 
   return found;
-- 
GitLab