Streams causing heap crash using Python C-Extensions

R

Raj Batra

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::eek:stringstream 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
 
R

Raj Batra

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
 
T

Thomas Heller

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
 

Ask a Question

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

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

No members online now.

Forum statistics

Threads
473,754
Messages
2,569,527
Members
44,998
Latest member
MarissaEub

Latest Threads

Top