[Matrix-SIG] PyArray_Free in arrayobject.c
Travis Oliphant
Oliphant.Travis@mayo.edu
Mon, 1 Mar 1999 18:28:26 -0600 (EST)
While I was looking at the source to write some documentation, I noticed
that PyArray_Free looks like it won't work as intended.
It appears the PyArray_Free is supposed to work along with PyArray_As2D
and PyArray_As1D to dereference objects and free up memory that those two
functions create.
It probably works as intended for 1D arrays since it is called often after
use of PyArray_As1D throughout multiarraymodule.c and arrayobject.c
But, it doesn't look like it would work for 2D arrays since the following
code which deallocates the array of pointers created by PyArray_As2D never
gets called.
extern int PyArray_Free(PyObject *op, char *ptr) {
PyArrayObject *ap = (PyArrayObject *)op;
int i, n;
if (ap->nd > 2) return -1;
if (ap->nd == 3) {
/* This statement won't be true if ap->nd <= 2 which it must be
in order to reach this point in the code. So the following code never
gets called??*/
n = ap->dimensions[0];
for (i=0; i<n; i++) {
free(((char **)ptr)[i]);
}
}
if (ap->nd >= 2) {
free(ptr);
}
Py_DECREF(ap);
return 0;
}
Has anyone successfully used PyArray_Free along with PyArray_As2D. For
now it looks like using PyArray_As2D springs a memory leak. Anyone know
what's going on here.
-Travis