[Numpy-discussion] slice question and bug

Todd Miller jmiller at stsci.edu
Thu Apr 11 14:36:03 EDT 2002


clee at spiralis.merseine.nu wrote:

>
>clee at spiralis.merseine.nu writes:
> > 
> > Hello,
> > I'm trying to track down a segv when I do the B[:] operation on an
> > array, "B", a that I've built in as a view on external data.  During...
> > [snip]
>
>To clarify my own somewhat non-sensical post: When I started composing
>my message, I was trying to figure out a bug in my own code that
>caused a crash while doing slice_array.  I've since fixed that bug.
>However, in the process of figuring out what I was doing wrong I
>was browsing the Numeric source code.  While examining
>PyArray_Free(..) in arrayobject.c, I saw that returns -1 whenever the
>number of dimensions is greater than 2, yet it has code that tests for
>when the number of dimensions equals 3.
>
>So utimately, my post is just an alert, that I think there might be
>some code that needs to be cleaned up. 
>
>Thanks,
> lacking-caffeine-ly yours
> -chris 
>
>_______________________________________________
>Numpy-discussion mailing list
>Numpy-discussion at lists.sourceforge.net
>https://lists.sourceforge.net/lists/listinfo/numpy-discussion
>
Looking at the code to PyArray_Free,  I agree with Chris.  Called to 
free a 2D
array, I think that PyArray_Free leaks all of the row storage because 
ap->nd == 2, not 3:

* {%c++%} */
     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) {
	     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;
     }
/* {%c++%} */


Other opinions?

Todd

-- 
Todd Miller 			jmiller at stsci.edu
STSCI / SSG			(410) 338 4576







More information about the NumPy-Discussion mailing list