#489, leaking cvarrmat test and fix

This commit is contained in:
James Bowman 2011-01-25 01:05:12 +00:00
parent 68ed806be0
commit 3a53d8667a
2 changed files with 21 additions and 1 deletions

View File

@ -1734,11 +1734,21 @@ static int convert_to_pts_npts_contours(PyObject *o, pts_npts_contours *dst, con
return 1; return 1;
} }
struct cvarrseq { class cvarrseq {
public:
union { union {
CvSeq *seq; CvSeq *seq;
CvArr *mat; CvArr *mat;
}; };
int freemat;
cvarrseq() {
freemat = false;
}
~cvarrseq() {
if (freemat) {
cvReleaseMat((CvMat**)&mat);
}
}
}; };
static int is_convertible_to_mat(PyObject *o) 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); assert(size != -1);
CvMat *mt = cvCreateMat((int)PySequence_Fast_GET_SIZE(fi), 1, CV_32SC(size)); 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++) { for (Py_ssize_t i = 0; i < PySequence_Fast_GET_SIZE(fi); i++) {
PyObject *e = PySequence_Fast_GET_ITEM(fi, i); PyObject *e = PySequence_Fast_GET_ITEM(fi, i);
PyObject *fe = PySequence_Fast(e, name); PyObject *fe = PySequence_Fast(e, name);

9
tests/python/leak4.py Normal file
View File

@ -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)