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