Matt Knox wrote:
>
> Hi there. I'm in the unfortunate situation of trying to track down a
> memory error in someone elses code, and to make matters worse I don't
> really know jack squat about C programming. The problem seems to arise
> when several numpy arrays are created from C arrays in the C api and
> returned to python, and then trying to print out or cast to a string
> the resulting array. I think the problem may be happening due to the
> following chunk of code:
> {
> PyObject* temp = PyArray_SimpleNewFromData(1, &numobjs, typeNum,
> dbValues);
> PyObject* temp2 = PyArray_FromArray((PyArrayObject*)temp,
> ((PyArrayObject*)temp)->descr, DEFAULT_FLAGS | ENSURECOPY);
> Py_DECREF(temp);
> PyDict_SetItemString(returnVal, "data", temp2);
> Py_DECREF(temp2);
> }
>
> Lets assume that all my other inputs up this point are fine and that
> numobjs, typeNum, and dbValues are fine. Is their anything obviously
> wrong with the above chunk of code? or does it appear ok? Ultimately
> the dictionary "returnVal" is returned by the function this code came
> from, and everything else is discarded. Any help is very greatly
> appreciated. Thanks in advance,
You didn't indicate what kind of trouble you are having.
First of all, this is kind of odd style. Why is a new array created
from a data-pointer and then copied using PyArray_FromArray (the
ENSURECOPY flag will give you a copy)? Using
temp2 = PyArray_Copy(temp)
seems simpler. This will also avoid the reference-count problem that
is currently happening in the PyArray_FromArray call on the descr
structure. Any array-creation function that takes a descr structure
"steals" a reference to it, so you need to increment the reference count
if you are passing an unowned reference to a ->descr structure.
-Travis
|