Bugfix: Memory leak in deletion of er_stack nodes of ERFilter.
authorSancho McCann <sanchom@gmail.com>
Thu, 12 Jun 2014 00:25:22 +0000 (17:25 -0700)
committerSancho McCann <sanchom@gmail.com>
Thu, 12 Jun 2014 18:02:06 +0000 (11:02 -0700)
modules/objdetect/src/erfilter.cpp

index e942094..6651a00 100644 (file)
@@ -42,6 +42,7 @@
 
 #include "precomp.hpp"
 #include <fstream>
+#include <queue>
 
 #if defined _MSC_VER && _MSC_VER == 1500
     typedef int int_fast32_t;
@@ -57,6 +58,27 @@ using namespace std;
 namespace cv
 {
 
+// Deletes a tree of ERStat regions starting at root. Used only
+// internally to this implementation.
+static void deleteERStatTree(ERStat* root) {
+    queue<ERStat*> to_delete;
+    to_delete.push(root);
+    while (!to_delete.empty()) {
+        ERStat* n = to_delete.front();
+        to_delete.pop();
+        ERStat* c = n->child;
+        if (c != NULL) {
+            to_delete.push(c);
+            ERStat* sibling = c->next;
+            while (sibling != NULL) {
+                to_delete.push(sibling);
+                sibling = sibling->next;
+            }
+        }
+        delete n;
+    }
+}
+
 ERStat::ERStat(int init_level, int init_pixel, int init_x, int init_y) : pixel(init_pixel),
                level(init_level), area(0), perimeter(0), euler(0), probability(1.0),
                parent(0), child(0), next(0), prev(0), local_maxima(0),
@@ -497,7 +519,7 @@ void ERFilterNM::er_tree_extract( InputArray image )
                     delete(stat->crossings);
                     stat->crossings = NULL;
                 }
-                delete stat;
+                deleteERStatTree(stat);
             }
             er_stack.clear();