Fix some memory leaks in HierarchicalClusteringIndex
authorPierre-Emmanuel Viel <p.emmanuel.viel@gmail.com>
Wed, 18 Dec 2013 14:01:47 +0000 (15:01 +0100)
committerPierre-Emmanuel Viel <p.emmanuel.viel@gmail.com>
Wed, 18 Dec 2013 21:46:41 +0000 (22:46 +0100)
modules/flann/include/opencv2/flann/hierarchical_clustering_index.h

index ce2d622..c27b648 100644 (file)
@@ -298,6 +298,11 @@ public:
         trees_ = get_param(params,"trees",4);
         root = new NodePtr[trees_];
         indices = new int*[trees_];
+
+        for (int i=0; i<trees_; ++i) {
+            root[i] = NULL;
+            indices[i] = NULL;
+        }
     }
 
     HierarchicalClusteringIndex(const HierarchicalClusteringIndex&);
@@ -310,11 +315,34 @@ public:
      */
     virtual ~HierarchicalClusteringIndex()
     {
+        free_elements();
+
+        if (root!=NULL) {
+            delete[] root;
+        }
+
         if (indices!=NULL) {
             delete[] indices;
         }
     }
 
+
+    /**
+     * Release the inner elements of indices[]
+     */
+    void free_elements()
+    {
+        if (indices!=NULL) {
+            for(int i=0; i<trees_; ++i) {
+                if (indices[i]!=NULL) {
+                    delete[] indices[i];
+                    indices[i] = NULL;
+                }
+            }
+        }
+    }
+
+
     /**
      *  Returns size of index.
      */
@@ -349,6 +377,9 @@ public:
         if (branching_<2) {
             throw FLANNException("Branching factor must be at least 2");
         }
+
+        free_elements();
+
         for (int i=0; i<trees_; ++i) {
             indices[i] = new int[size_];
             for (size_t j=0; j<size_; ++j) {
@@ -388,6 +419,17 @@ public:
         load_value(stream, centers_init_);
         load_value(stream, leaf_size_);
         load_value(stream, memoryCounter);
+
+        free_elements();
+
+        if (root!=NULL) {
+            delete[] root;
+        }
+
+        if (indices!=NULL) {
+            delete[] indices;
+        }
+
         indices = new int*[trees_];
         root = new NodePtr[trees_];
         for (int i=0; i<trees_; ++i) {