C Wrapper Function, crashing Python?

Discussion in 'Python' started by Java and Swing, Oct 12, 2005.

  1. 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!
    Java and Swing, Oct 12, 2005
    #1
    1. Advertising

  2. 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!
    Java and Swing, Oct 12, 2005
    #2
    1. Advertising

  3. 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!
    Java and Swing, Oct 12, 2005
    #3
  4. Op 2005-10-12, Java and Swing schreef <>:
    > 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
    Antoon Pardon, Oct 12, 2005
    #4
  5. 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 <>:
    > > 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
    Java and Swing, Oct 12, 2005
    #5
  6. 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 <>:
    > > 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
    Java and Swing, Oct 12, 2005
    #6
  7. 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 <>:
    > > > 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
    Java and Swing, Oct 12, 2005
    #7
  8. ok, further digging...I found that in the C function GetVal...it is
    crashing where I try to malloc some memory. Note, I have no problems
    when running this from C..just from Python using my wrapper.

    GetVal looks something like..
    MY_NUM *GetVal(const char *in, const int x) {
    MY_NUM *results, *returnResults;
    results = (MY_NUM *) malloc((x * sizeof(MY_NUM) + 1);
    returnResults = results;
    // ..do more work..
    return returnResults;
    }

    I put in print statements into the C code and found that it is crashing
    at the line where I malloc some space for "results".

    ....any ideas why this is crashing when calling from Python via C
    wrapper?

    Java and Swing wrote:
    > 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 <>:
    > > > > 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
    Java and Swing, Oct 12, 2005
    #8
  9. "Java and Swing" <> writes:

    > static PyObject *wrap_doStuff(PyObject *self, PyObject *args) {

    [...]
    > char *aString = 0;
    > char *bString = 0;

    [...]
    > int ok = PyArg_ParseTuple(args, "sss", &in, &aString, &bString);

    [...]
    > free(aString);
    > free(bString);


    aString and bString are pointers to memory managed by the strings in
    your args tuple. You must not free them! The memory is automatically
    managed by Python.

    Bernhard

    --
    Intevation GmbH http://intevation.de/
    Skencil http://skencil.org/
    Thuban http://thuban.intevation.org/
    Bernhard Herzog, Oct 12, 2005
    #9
  10. thanks for the tip, however even when I do not free aString or bString,
    i'm still crashing at the malloc in the c function, not the wrapper.


    Bernhard Herzog wrote:
    > "Java and Swing" <> writes:
    >
    > > static PyObject *wrap_doStuff(PyObject *self, PyObject *args) {

    > [...]
    > > char *aString = 0;
    > > char *bString = 0;

    > [...]
    > > int ok = PyArg_ParseTuple(args, "sss", &in, &aString, &bString);

    > [...]
    > > free(aString);
    > > free(bString);

    >
    > aString and bString are pointers to memory managed by the strings in
    > your args tuple. You must not free them! The memory is automatically
    > managed by Python.
    >
    > Bernhard
    >
    > --
    > Intevation GmbH http://intevation.de/
    > Skencil http://skencil.org/
    > Thuban http://thuban.intevation.org/
    Java and Swing, Oct 12, 2005
    #10
  11. "Java and Swing" <> writes:

    > thanks for the tip, however even when I do not free aString or bString,
    > i'm still crashing at the malloc in the c function, not the wrapper.


    Do you have any more places where you use free incorrectly? In my
    experience, calling free with invalid values can corrupt the data
    structures used by the memory allocator in such a way that subsequent
    malloc calls crash.

    Bernhard

    --
    Intevation GmbH http://intevation.de/
    Skencil http://skencil.org/
    Thuban http://thuban.intevation.org/
    Bernhard Herzog, Oct 12, 2005
    #11
  12. As far as my C Wrapper functions are concerned...I no longer have the
    need for free(...). I do use PyMem_Free, for structures I allocated by
    using PyMem_New(...).

    In my C code I do have things such as...

    char *foo(const char *in) {
    char *tmp;
    tmp = (char *) malloc((strlen(in) * sizeof(char)) + 1);
    strcpy(tmp, in);
    ...
    ...
    free(tmp);
    return someValue;
    }

    Is that appropriate? I was under the impression that when you malloc
    memory, you free it when done.

    I also have things like...

    char *bar(char *in) {
    char *results, *finalResults;
    results = (char *) malloc(...);
    finalResults = results;

    while (...) { *results++ = some_val; }

    return finalResults;
    }

    ....is that correct?

    As I mentioned earlier, when I run these functions from C I have no
    troubles...I can run them 5, 10, 15 times, etc. From Python, using my
    wrapper function is when I have trouble.

    Thanks in advance.

    Bernhard Herzog wrote:
    > "Java and Swing" <> writes:
    >
    > > thanks for the tip, however even when I do not free aString or bString,
    > > i'm still crashing at the malloc in the c function, not the wrapper.

    >
    > Do you have any more places where you use free incorrectly? In my
    > experience, calling free with invalid values can corrupt the data
    > structures used by the memory allocator in such a way that subsequent
    > malloc calls crash.
    >
    > Bernhard
    >
    > --
    > Intevation GmbH http://intevation.de/
    > Skencil http://skencil.org/
    > Thuban http://thuban.intevation.org/
    Java and Swing, Oct 12, 2005
    #12
  13. "Java and Swing" <> writes:

    > char *foo(const char *in) {
    > char *tmp;
    > tmp = (char *) malloc((strlen(in) * sizeof(char)) + 1);
    > strcpy(tmp, in);
    > ...
    > ...
    > free(tmp);
    > return someValue;
    > }
    >
    > Is that appropriate? I was under the impression that when you malloc
    > memory, you free it when done.


    Looks fine. I hope someValue does not point somewhere into the tmp
    buffer, though.

    > I also have things like...
    >
    > char *bar(char *in) {
    > char *results, *finalResults;
    > results = (char *) malloc(...);
    > finalResults = results;
    >
    > while (...) { *results++ = some_val; }
    >
    > return finalResults;
    > }


    Seems OK, too, assuming the results buffer is big enough.

    Bernhard

    --
    Intevation GmbH http://intevation.de/
    Skencil http://skencil.org/
    Thuban http://thuban.intevation.org/
    Bernhard Herzog, Oct 12, 2005
    #13
  14. Bernhard Herzog wrote:
    > "Java and Swing" <> writes:
    >
    > > char *foo(const char *in) {
    > > char *tmp;
    > > tmp = (char *) malloc((strlen(in) * sizeof(char)) + 1);
    > > strcpy(tmp, in);
    > > ...
    > > ...
    > > free(tmp);
    > > return someValue;
    > > }
    > >
    > > Is that appropriate? I was under the impression that when you malloc
    > > memory, you free it when done.

    >
    > Looks fine. I hope someValue does not point somewhere into the tmp
    > buffer, though.


    someValue doesn't.

    >
    > > I also have things like...
    > >
    > > char *bar(char *in) {
    > > char *results, *finalResults;
    > > results = (char *) malloc(...);
    > > finalResults = results;
    > >
    > > while (...) { *results++ = some_val; }
    > >
    > > return finalResults;
    > > }

    >
    > Seems OK, too, assuming the results buffer is big enough.


    results = (char *) malloc((sizeof(char) * strlen(in) + 1);
    ..should be big enough. At any rate, it works four times in a row
    before it fails.

    I wonder what else or how else to solve this. Why is malloc'ing
    the memory crashing it!?
    Java and Swing, Oct 12, 2005
    #14
  15. Java and Swing

    Tony Nelson Guest

    In article <>,
    "Java and Swing" <> 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.:' *firstname*nlsnews@georgea*lastname*.com
    ' <http://www.georgeanelson.com/>
    Tony Nelson, Oct 15, 2005
    #15
    1. Advertising

Want to reply to this thread or ask your own question?

It takes just 2 minutes to sign up (and it's free!). Just click the sign up button to choose a username and then you can ask your own questions on the forum.
Similar Threads
  1. Bryan Olson

    Crashing Python.exe with TkInter

    Bryan Olson, Jul 24, 2004, in forum: Python
    Replies:
    0
    Views:
    489
    Bryan Olson
    Jul 24, 2004
  2. Leeuw van der, Tim
    Replies:
    1
    Views:
    263
    Stefan Behnel
    Feb 2, 2005
  3. Leeuw van der, Tim
    Replies:
    1
    Views:
    443
    John Machin
    Feb 2, 2005
  4. Leeuw van der, Tim
    Replies:
    4
    Views:
    426
    Nick Coghlan
    Feb 5, 2005
  5. Adam Tomjack

    Embedded python debug build crashing.

    Adam Tomjack, Aug 27, 2005, in forum: Python
    Replies:
    0
    Views:
    305
    Adam Tomjack
    Aug 27, 2005
Loading...

Share This Page