Memory leaks
ioadler at my-deja.com.bbs
ioadler at my-deja.com.bbs
Thu Jul 13 18:30:03 EDT 2000
More information about the Python-list mailing list
Thu Jul 13 18:30:03 EDT 2000
- Previous message (by thread): Memory leaks
- Next message (by thread): Memory leaks
- Messages sorted by: [ date ] [ thread ] [ subject ] [ author ]
In article <8F6667253gmcmhypernetcom at 199.171.54.154>, gmcm at hypernet.com (Gordon McMillan) wrote: > Ingo Adler wrote: > > [strange leaks in SWIG'd code] > > >I have some simple Python-Code which generated memory leaks (ca. 4MB): > >(The real code is more complicated, but I could strip it down to this > >simple example = the smallest example with the memory leak.) > >//--------------------------- > >x = X() > > > >for i in range(100000): > > y = x.getY() > > y.getNumber() > >//--------------------------- > > Doing things in the "obvious" way from your (snipped) incomplete code, I > get no leak when using MSVC 5. > > - Gordon Hi Gordon, Finally, I reproduced the leaks under the control of "Code Guard", which can list them. For every call in the loop there is an entry like this (I translated it to English): Error 00175. 0x300010 (Thread 0xFFE455D5): Ressource-Leak: memory block (0x2732848) has never been released memory block (0x02732848) [Size: 40 Byte] was allocated with malloc call stack: 0x004AECDD(=FORTUNA.EXE:0x01:0ADCDD) \Python\Objects\stringobject.c#145 0x0044BE99(=FORTUNA.EXE:0x01:04AE99) \src\fortuna_wrap.c#769 0x0044F969(=FORTUNA.EXE:0x01:04E969) \src\fortuna_wrap.c#1824 0x0046B9F9(=FORTUNA.EXE:0x01:06A9F9) \Python\Python\ceval.c#2359 0x0046B892(=FORTUNA.EXE:0x01:06A892) \Python\Python\ceval.c#2324 0x0045EDBE(=FORTUNA.EXE:0x01:05DDBE) \Python\bltinmodule.c#126 That makes 40*100000 = 4 MB as I measured roughly before. fortuna_wrap.c is the code generated by swig: ... SWIGSTATICRUNTIME(PyObject *) SWIG_NewPointerObj(void *ptr, _swig_type_info *type) { char result[512]; PyObject *robj; if (!ptr) { Py_INCREF(Py_None); return Py_None; } #ifdef SWIG_COBJECT_TYPES robj = PyCObject_FromVoidPtrAndDesc((void *) ptr, type->name, NULL); #else SWIG_MakePtr(result,ptr,type); // line 769 robj = PyString_FromString(result); #endif return robj; } ... #define Y_getX(_swigobj) (_swigobj->getX()) static PyObject *_wrap_Y_getX(PyObject *self, PyObject *args) { Y *_arg0; PyObject *_resultobj,*_argo0=0; X *_result; self = self; if(!PyArg_ParseTuple(args,"O:Y_getX",&_argo0)) return NULL; if ((SWIG_ConvertPtr(_argo0,(void **) &_arg0,SWIGTYPE_Y_p,1)) == -1) return NULL; _result = (X *)Y_getX(_arg0); // line 1824 _resultobj = SWIG_NewPointerObj((void *) _result, SWIGTYPE_X_p); return _resultobj; } ... So it happens in PyString_FromString - but only with this loop (= both functions in the loop). Any suggestions? Ingo Sent via Deja.com http://www.deja.com/ Before you buy.
- Previous message (by thread): Memory leaks
- Next message (by thread): Memory leaks
- Messages sorted by: [ date ] [ thread ] [ subject ] [ author ]
More information about the Python-list mailing list