Streams causing heap crash using Python C-Extensions

Raj Batra batraraj at hotmail.com
Thu Sep 18 13:09:45 EDT 2003


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(localtime(&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 at hotmail.com (Raj Batra) wrote in message news:<ee04f1ee.0309161604.2f13c59b at posting.google.com>...
> 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(PySwitchObject * self, PyObject * args)
> {
>     int circuit;
> 
>     if (!PyArg_ParseTuple(args, "i", &circuit))
>     {
>        // Error handling... 
>     }
> 
>     self->_switch->circuit((U8) circuit);
>     Py_INCREF(Py_None);
>     return(Py_None);
> }
> 
> // Called by pyCircuit method above. Multiple calls to this method
> // yield a heap assertion.
> void Switch::circuit(U8 c)
> {
>     std::ostringstream 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




More information about the Python-list mailing list