Sorry about the double post...

anyhow, after putting in debug statements I found that it was crashing
when it called, free(result)....so I removed the free(result).

now it crashes when it gets to, b = GetVal(bString, count(bString,
","));

..any ideas?

Java and Swing wrote:
> Antoon,
>    I just saw that to.  I updated the code like so...
>
> static PyObject *wrap_doStuff(PyObject *self, PyObject *args) {
>       // this will store the result in a Python object
>       PyObject *finalResult;
>
>       // get arguments from Python
>       char *result = 0;
>       char *in= 0;
>               char *aString = 0;
>       char *bString = 0;
>       MY_NUM *a = (MY_NUM *) PyMem_Malloc((20 * sizeof(MY_NUM) + 1);  //
> the array will be 20 long
>       MY_NUM *b = (MY_NUM *) PyMem_Malloc((20 * sizeof(MY_NUM) + 1); //
> the array will be 20 long
>       int ok = PyArg_ParseTuple(args, "sss", &in, &aString, &bString);
>       if (!ok) return 0;
>
>       // do work to get a and b
>       // count - returns an int;  GetVal - returns a MY_NUM * (a pointer
> to a MY_NUM array)
>       a = GetVal(aString, count(aString, ","));
>       b = GetVal(bString, count(bString, ","));
>
>       // make function call, which returns a char *
>       result = doStuff(in, a, b);
>
>       // save result in Python string
>       finalResult = PyString_FromString(result);
>
>       // free memory
>       PyMem_Free(a);
>       PyMem_Free(b);
>       free(aString);
>       free(bString);
>       free(result);
>
>       // return the result as a Python string
>       return finalResult;
>   }
>
> ..as you can see, i malloc'ed memory, and free'd the memory.  However,
> I still have python crashing (after only 3 successful calls to
> doStuff).  And yes, doStuff is a plain C function...nothing related to
> Python.
>
>
> Antoon Pardon wrote:
> > Op 2005-10-12, Java and Swing schreef <[EMAIL PROTECTED]>:
> > > static PyObject *wrap_doStuff(PyObject *self, PyObject *args) {
> > >   // this will store the result in a Python object
> > >   PyObject *finalResult;
> > >
> > >   // get arguments from Python
> > >   char *result = 0;
> > >   char *in= 0;
> > >           char *aString = 0;
> > >   char *bString = 0;
> > >   MY_NUM *a;
> > >   MY_NUM *b;
> > >   int ok = PyArg_ParseTuple(args, "sss", &in, &aString, &bString);
> > >   if (!ok) return 0;
> > >
> > >   // do work to get a and b
> > >   // count - returns an int;  GetVal - returns a char *
> > >   a = GetVal(aString, count(aString, ","));
> > >   b = GetVal(bString, count(bString, ","));
> > >
> > >   // make function call, which returns a char *
> > >   result = doStuff(in, a, b);
> > >
> > >   // save result in Python string
> > >   finalResult = PyString_FromString(result);
> > >
> > >   // free memory
> > >   PyMem_Free(result);
> > >   PyMem_Free(a);
> > >   PyMem_Free(b);
> > >
> > >   // return the result as a Python string
> > >   return finalResult;
> > > }
> > >
> > > ...from python I can call this function 4 times...works fine.  WHen I
> > > call it for the fifth time python.exe crashes.  im thinking some memory
> > > problem in the wrapper function perhaps...but I am not sure.  The
> > > actually C function, doStuff can be called 5, 6,7...N times without a
> > > problem
> > > so i know its gotta be my wrapper.
> > >
> > > Any ideas?  Thanks!
> >
> > Well assuming your doStuff is a C function that knows nothing of python.
> > it might be the PyMem_Free(result).
> > http://docs.python.org/api/memoryInterface.html says the following:
> >
> > void PyMem_Free(void *p)
> >     Frees the memory block pointed to by p, which must have been
> >     returned by a previous call to PyMem_Malloc() or PyMem_Realloc().
> >     Otherwise, or if PyMem_Free(p) has been called before, undefined
> >     behavior occurs. If p is NULL, no operation is performed.
> >
> > But your result wasn't allocated by a PyMem_Malloc, it was returned
> > to you by a C function.
> > 
> > -- 
> > Antoon Pardon

-- 
http://mail.python.org/mailman/listinfo/python-list

Reply via email to