From: Andrea R. <ari...@pi...> - 2002-12-11 15:03:08
|
On Wednesday, Dec 11, 2002, at 14:33 Europe/Rome, Konrad Hinsen wrote: >> 2) Next in the source code I've found the following memory allocation: >> >> data = (char **)malloc(n*sizeof(char *)); >> >> without checking if malloc return NULL or not. As far as I know it's >> not safe, even if it's very unlikely that this malloc would fail. > > Right. Did you submit a bug report? Just done. By the way reading the code again and again I got another question. Here is the complete code fragment: extern int PyArray_As2D(PyObject **op, char ***ptr, int *d1, int *d2, int typecode) { PyArrayObject *ap; int i, n; char **data; if ((ap = (PyArrayObject *)PyArray_ContiguousFromObject(*op, typecode, 2, 2)) == NULL) return -1; n = ap->dimensions[0]; data = (char **)malloc(n*sizeof(char *)); for(i=0; i<n; i++) { data[i] = ap->data + i*ap->strides[0]; } *op = (PyObject *)ap; <=== It doesn't sound good to me!!! *ptr = data; *d1 = ap->dimensions[0]; *d2 = ap->dimensions[1]; return 0; } Looking at the marked line I started wondering about the fate of the object originally pointed by op. Without explicitly deallocating it you lost any chance to reach it. It turns out in a memory leakage. Obviously the same problem happend in PyArray_As1D function. I'm very interested in this topic because I'm writing some Python extensions and I'd like to understand how I have to handle all these objects correctly. So how "long" does a Python object live? How can I release correctly the allocated memory? Thanks, Andrea. --- Andrea Riciputi <mailto:and...@li...> "Science is like sex: sometimes something useful comes out, but that is not the reason we are doing it" -- (Richard Feynman) |