In article <[EMAIL PROTECTED]>, "Java and Swing" <[EMAIL PROTECTED]> wrote:
> one more update... > > if I remove PyMem_Free and free(...) ...so no memory clean up...I can > still only call doStuff 4 times, the 5th attemp crashes Python. > > Java and Swing wrote: > > update: > > if I use C's free(result), free(a) free(b) instead of PyMem_Free...I > > only get one successfuly use/call of doStuff. > > > > i.e. > > // this works > > doStuff(...) > > > > // python crashes here > > doStuff(...) > > > > Java and Swing wrote: > > > 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! > I think your wrapper should look something like: 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 free(result); free(a); free(b); // return the result as a Python string return finalResult; } You must match malloc() with free(), and PyMem_Malloc() with PyMem_Free(). Malloc() and free() usually crash /after/ the call that did the damage. You may wish to avail yourself of your platform's malloc debugging facilities. Note that I don't do this stuff in C, I do it in pyrex, and I'm new to it anyway, so there may still be something wrong. Unless you are determined to learn how to do this in C, I think you should switch to pyrex. ________________________________________________________________________ TonyN.:' [EMAIL PROTECTED] ' <http://www.georgeanelson.com/> -- http://mail.python.org/mailman/listinfo/python-list