[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

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

		printf("kdpee_py: nullness!\n");
		return NULL;
	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]])
      for i in range(5000): tmp = kdpee(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.


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