[Numpy-discussion] Solving a memory leak in a numpy extension; PyArray_ContiguousFromObject

Dan S dan.s.towell+numpy@gmail....
Fri Apr 17 10:25:25 CDT 2009


Hi -

I have written a numpy extension which works fine but has a memory
leak. It takes a single array argument and returns a single scalar.
After reducing the code down in order to chase the problem, I have the
following:

static PyObject * kdpee_pycall(PyObject *self, PyObject *args)
{
	PyObject *input;
	PyArrayObject *array;
	int n, numdims;
	
	if (!PyArg_ParseTuple(args, "O", &input))
		return NULL;
	
	// Ensure we have contiguous, 2D, floating-point data:
	array = (PyArrayObject*) PyArray_ContiguousFromObject(input,
PyArray_DOUBLE, 2, 2);

	if(array==NULL){
		printf("kdpee_py: nullness!\n");
		return NULL;
	}
	PyArray_XDECREF(array);
	Py_DECREF(array); // destroy the contig array
	Py_DECREF(input); // is this needed? doc says no, but it seems to fix
a reference-count-leak
	return PyFloat_FromDouble(3.1415927); // temporary
}


The test code is

      from numpy import *
      from kdpee import *
      import sys
      a = array( [[1,2,3,4,5,1,2,3,4,5], [6,7,8,9,0,6,7,8,9,0]])
      sys.getrefcount(a)
      for i in range(5000): tmp = kdpee(a)

      sys.getrefcount(a)

Every time I run this code I get "2" back from both calls to
sys.getrefcount(a), but I'm still getting a memory leak of about 0.4
MB. What am I doing wrong?

I'll be grateful for any suggestions you can offer.

Thanks
Dan

P.S. My system is python 2.5.4 (from macports) on intel Mac 10.4.11,
numpy provided by macports package "py25-numpy" v1.2.1


More information about the Numpy-discussion mailing list