Streams causing heap crash using Python C-Extensions

Collapse
This topic is closed.
X
X
 
  • Time
  • Show
Clear All
new posts
  • Raj Batra

    Streams causing heap crash using Python C-Extensions

    Hi,

    I've created a dll that you can import into python. The function
    calls an ostringstream class. Calling this function repeatedly in python
    will cause a Microsoft Visual C++ Debug Library error:

    Debug Assertion Failed!
    Program: C:\Program Files\Python22\ python.exe
    File: dbgheap.c
    Line: 346

    Expression: _CrtCheckMemory ()

    Here are snippets of the code:

    // Method called by python via a PySwitchObject
    static PyObject * pyCircuit(PySwi tchObject * self, PyObject * args)
    {
    int circuit;

    if (!PyArg_ParseTu ple(args, "i", &circuit))
    {
    // Error handling...
    }

    self->_switch->circuit((U8) circuit);
    Py_INCREF(Py_No ne);
    return(Py_None) ;
    }

    // Called by pyCircuit method above. Multiple calls to this method
    // yield a heap assertion.
    void Switch::circuit (U8 c)
    {
    std::ostringstr eam close;

    close << "Some formating...";

    // Use the close method - doesn't really matter.
    }


    The error is always within the constructor or destructor of ostringstream and
    in the file called xmutex.cpp (implements mutex lock for iostreams) which
    calls the malloc/dealloc functions.

    I have tried other streams such as fstream, and get similar behavior.
    Switching to a char buffer[] and sprintf is my current work around the
    ostringstream issue.

    Any thoughts about what is going on?

    I'm using Python2.2.2, with Visual C++ 7 (.NET). The error occurs using
    both pythonwin and the standard command line python.

    Thanks,

    Raj
  • Raj Batra

    #2
    Re: Streams causing heap crash using Python C-Extensions

    Just a follow up - It appears that the crash isn't related to
    just C++ i/o streaming. I tried using the fopen/fclose (e.g for logging)
    and again repeated calls from python to the code causes the same
    _CrtCheckMemory () error.

    E.g.

    void void Switch::circuit (U8 c)
    {
    if (!_filename) return;

    FILE *out = fopen(_filename , "a");

    if (!out) return;

    time_t t = time(0);
    fprintf(out,"%s \n %s%s\n", asctime(localti me(&t)), "Header", "Log stuff");

    fclose(out);

    }

    Another person solved the problem by using cout and then in python
    redirected stdout to a file. Then all calls to the cextension
    forced cout to write to a file. I prefer not to go down that road.

    Any thoughts appreciated as to what may be going on.

    Thanks,

    Raj


    batraraj@hotmai l.com (Raj Batra) wrote in message news:<ee04f1ee. 0309161604.2f13 c59b@posting.go ogle.com>...[color=blue]
    > Hi,
    >
    > I've created a dll that you can import into python. The function
    > calls an ostringstream class. Calling this function repeatedly in python
    > will cause a Microsoft Visual C++ Debug Library error:
    >
    > Debug Assertion Failed!
    > Program: C:\Program Files\Python22\ python.exe
    > File: dbgheap.c
    > Line: 346
    >
    > Expression: _CrtCheckMemory ()
    >
    > Here are snippets of the code:
    >
    > // Method called by python via a PySwitchObject
    > static PyObject * pyCircuit(PySwi tchObject * self, PyObject * args)
    > {
    > int circuit;
    >
    > if (!PyArg_ParseTu ple(args, "i", &circuit))
    > {
    > // Error handling...
    > }
    >
    > self->_switch->circuit((U8) circuit);
    > Py_INCREF(Py_No ne);
    > return(Py_None) ;
    > }
    >
    > // Called by pyCircuit method above. Multiple calls to this method
    > // yield a heap assertion.
    > void Switch::circuit (U8 c)
    > {
    > std::ostringstr eam close;
    >
    > close << "Some formating...";
    >
    > // Use the close method - doesn't really matter.
    > }
    >
    >
    > The error is always within the constructor or destructor of ostringstream and
    > in the file called xmutex.cpp (implements mutex lock for iostreams) which
    > calls the malloc/dealloc functions.
    >
    > I have tried other streams such as fstream, and get similar behavior.
    > Switching to a char buffer[] and sprintf is my current work around the
    > ostringstream issue.
    >
    > Any thoughts about what is going on?
    >
    > I'm using Python2.2.2, with Visual C++ 7 (.NET). The error occurs using
    > both pythonwin and the standard command line python.
    >
    > Thanks,
    >
    > Raj[/color]

    Comment

    • Thomas Heller

      #3
      Re: Streams causing heap crash using Python C-Extensions

      batraraj@hotmai l.com (Raj Batra) writes:
      [color=blue][color=green]
      >> I'm using Python2.2.2, with Visual C++ 7 (.NET). The error occurs using
      >> both pythonwin and the standard command line python.[/color][/color]

      I don't know whether you can use C++ stream I/O in a Python extension or
      not, but if you use MSVC7 to compile the extension, your Python must
      also be compiled with this one (generally).

      Thomas

      Comment

      Working...