diff --git a/modules/python/cv.cpp b/modules/python/cv.cpp index 80df480a98..ffd35c3d8f 100644 --- a/modules/python/cv.cpp +++ b/modules/python/cv.cpp @@ -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 index 0000000000..3268200522 --- /dev/null +++ b/tests/python/leak4.py @@ -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)