नीचे दिया गया फ़ंक्शन एक पायथन फ़ाइल हैंडल लेता है, फ़ाइल से पैक किए गए बाइनरी डेटा में पढ़ता है, एक पायथन शब्दकोश बनाता है और इसे वापस करता है। अगर मैं इसे अंतहीन रूप से लूप करता हूं, तो यह लगातार राम का उपभोग करेगा। मेरे RefCounting के साथ क्या गलत है?मेरा पायथन सी एक्सटेंशन स्मृति लीक क्यों कर रहा है?
static PyObject* __binParse_getDBHeader(PyObject *self, PyObject *args){
PyObject *o; //generic object
PyObject* pyDB = NULL; //this has to be a py file object
if (!PyArg_ParseTuple(args, "O", &pyDB)){
return NULL;
} else {
Py_INCREF(pyDB);
if (!PyFile_Check(pyDB)){
Py_DECREF(pyDB);
PyErr_SetString(PyExc_IOError, "argument 1 must be open file handle");
return NULL;
}
}
FILE *fhDB = PyFile_AsFile(pyDB);
long offset = 0;
DB_HEADER *pdbHeader = malloc(sizeof(DB_HEADER));
fseek(fhDB,offset,SEEK_SET); //at the beginning
fread(pdbHeader, 1, sizeof(DB_HEADER), fhDB);
if (ferror(fhDB)){
fclose(fhDB);
Py_DECREF(pyDB);
PyErr_SetString(PyExc_IOError, "failed reading database header");
return NULL;
}
Py_DECREF(pyDB);
PyObject *pyDBHeader = PyDict_New();
Py_INCREF(pyDBHeader);
o=PyInt_FromLong(pdbHeader->version_number);
PyDict_SetItemString(pyDBHeader, "version", o);
Py_DECREF(o);
PyObject *pyTimeList = PyList_New(0);
Py_INCREF(pyTimeList);
int i;
for (i=0; i<NUM_DRAWERS; i++){
//epochs
o=PyInt_FromLong(pdbHeader->last_good_test[i]);
PyList_Append(pyTimeList, o);
Py_DECREF(o);
}
PyDict_SetItemString(pyDBHeader, "lastTest", pyTimeList);
Py_DECREF(pyTimeList);
o=PyInt_FromLong(pdbHeader->temp);
PyDict_SetItemString(pyDBHeader, "temp", o);
Py_DECREF(o);
free(pdbHeader);
return (pyDBHeader);
}
एक नज़र लेने के लिए धन्यवाद,
LarsenMTL
टोरस्टन, धन्यवाद, मैंने अभी आपके 4 अनुच्छेदों में और अधिक सीखा है, फिर मैंने सुबह सुबह दस्तावेज़ों पर घूरते हुए देखा। मैं अपने सभी उधारित बनाम नए संदर्भों की जांच करूंगा। – Mark