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