#489, leaking cvarrmat test and fix
authorJames Bowman <no@email>
Tue, 25 Jan 2011 01:05:12 +0000 (01:05 +0000)
committerJames Bowman <no@email>
Tue, 25 Jan 2011 01:05:12 +0000 (01:05 +0000)
modules/python/cv.cpp
tests/python/leak4.py [new file with mode: 0644]

index 80df480..ffd35c3 100644 (file)
@@ -1734,11 +1734,21 @@ static int convert_to_pts_npts_contours(PyObject *o, pts_npts_contours *dst, con
   return 1;
 }
 
-struct cvarrseq {
+class cvarrseq {
+public:
   union {
     CvSeq *seq;
     CvArr *mat;
   };
+  int freemat;
+  cvarrseq() {
+    freemat = false;
+  }
+  ~cvarrseq() {
+    if (freemat) {
+      cvReleaseMat((CvMat**)&mat);
+    }
+  }
 };
 
 static int is_convertible_to_mat(PyObject *o)
@@ -1782,6 +1792,7 @@ static int convert_to_cvarrseq(PyObject *o, cvarrseq *dst, const char *name = "n
     }
     assert(size != -1);
     CvMat *mt = cvCreateMat((int)PySequence_Fast_GET_SIZE(fi), 1, CV_32SC(size));
+    dst->freemat = true; // dealloc this mat when done
     for (Py_ssize_t i = 0; i < PySequence_Fast_GET_SIZE(fi); i++) {
       PyObject *e = PySequence_Fast_GET_ITEM(fi, i);
       PyObject *fe = PySequence_Fast(e, name);
diff --git a/tests/python/leak4.py b/tests/python/leak4.py
new file mode 100644 (file)
index 0000000..3268200
--- /dev/null
@@ -0,0 +1,9 @@
+import cv
+import math
+import time
+
+N=50000
+print "leak4"
+while True:
+    seq=list((i*1., i*1.) for i in range(N))
+    cv.Moments(seq)