में नहीं, मैं यहां पूछ रहा हूं क्योंकि मुझे ओपनसीवी डेवलपर्स से अब तक कोई मदद नहीं मिली है। मैंने समस्या को एक बहुत ही सरल परीक्षण मामले में कम कर दिया ताकि शायद सीपीथॉन के साथ कुछ पृष्ठभूमि वाले किसी भी व्यक्ति की मदद कर सके।ओपनसीवी: पायथन इंटरफ़ेस के साथ मेमोरी लीक लेकिन सी संस्करण
इस सी कोड लीक नहीं करता:
int main() {
while(true) {
int hist_size[] = {40};
float range[] = {0.0f,255.0f};
float* ranges[] = {range};
CvHistogram* hist = cvCreateHist(1, hist_size, CV_HIST_ARRAY, ranges, 1);
cvReleaseHist(&hist);
}
}
यह अजगर कोड करता रिसाव:
while True: cv.CreateHist([40], cv.CV_HIST_ARRAY, [[0,255]], 1)
मैं (OpenCVs वर्तमान SVN ट्रंक कोड का) CPython कोड के माध्यम से खोज की है और इस पाया:
struct cvhistogram_t {
PyObject_HEAD
CvHistogram h;
PyObject *bins;
};
...
/* cvhistogram */
static void cvhistogram_dealloc(PyObject *self)
{
cvhistogram_t *cvh = (cvhistogram_t*)self;
Py_DECREF(cvh->bins);
PyObject_Del(self);
}
static PyTypeObject cvhistogram_Type = {
PyObject_HEAD_INIT(&PyType_Type)
0, /*size*/
MODULESTR".cvhistogram", /*name*/
sizeof(cvhistogram_t), /*basicsize*/
};
static PyObject *cvhistogram_getbins(cvhistogram_t *cvh)
{
Py_INCREF(cvh->bins);
return cvh->bins;
}
static PyGetSetDef cvhistogram_getseters[] = {
{(char*)"bins", (getter)cvhistogram_getbins, (setter)NULL, (char*)"bins", NULL},
{NULL} /* Sentinel */
};
static void cvhistogram_specials(void)
{
cvhistogram_Type.tp_dealloc = cvhistogram_dealloc;
cvhistogram_Type.tp_getset = cvhistogram_getseters;
}
...
static PyObject *pycvCreateHist(PyObject *self, PyObject *args, PyObject *kw)
{
const char *keywords[] = { "dims", "type", "ranges", "uniform", NULL };
PyObject *dims;
int type;
float **ranges = NULL;
int uniform = 1;
if (!PyArg_ParseTupleAndKeywords(args, kw, "Oi|O&i", (char**)keywords, &dims, &type, convert_to_floatPTRPTR, (void*)&ranges, &uniform)) {
return NULL;
}
cvhistogram_t *h = PyObject_NEW(cvhistogram_t, &cvhistogram_Type);
args = Py_BuildValue("Oi", dims, CV_32FC1);
h->bins = pycvCreateMatND(self, args);
Py_DECREF(args);
if (h->bins == NULL) {
return NULL;
}
h->h.type = CV_HIST_MAGIC_VAL;
if (!convert_to_CvArr(h->bins, &(h->h.bins), "bins"))
return NULL;
ERRWRAP(cvSetHistBinRanges(&(h->h), ranges, uniform));
return (PyObject*)h;
}
और OpenCV सी हेडर से:
typedef struct CvHistogram
{
int type;
CvArr* bins;
float thresh[CV_MAX_DIM][2]; /* For uniform histograms. */
float** thresh2; /* For non-uniform histograms. */
CvMatND mat; /* Embedded matrix header for array histograms. */
}
CvHistogram;
मैं बिल्कुल सब कुछ समझ में नहीं आता है क्योंकि मैं पहले अजगर को सी-इंटरफेस के साथ काम नहीं। लेकिन शायद मैं जिस बग को खोज रहा हूं वह इस कोड में कहीं है।
क्या मैं सही हूँ? या मुझे बग के लिए कहां खोजना चाहिए? मैं इसे कैसे ठीक करूं?
(जो लोग इस सवाल के पिछले संस्करण देखा है के लिए ध्यान दें:। मैं गलत कोड को देखा उनका बड़ा घूँट इंटरफ़ेस पदावनत किया गया था और अब और नहीं इस्तेमाल किया है (लेकिन कोड SVN में वहाँ अभी भी था, यही कारण है कि मैं यह उलझन में । तो interfaces/swig
पर गौर नहीं करते हैं, इस कोड को पुरानी है और उपयोग नहीं किया। वर्तमान कोड modules/python
में रहती है।)
Upstream bug report: memleak in OpenCV Python CreateHist
'CreateHist' एक ऑब्जेक्ट देता है। क्योंकि यह किसी भी चर के लिए असाइन नहीं किया गया है, इसे भविष्य में कुछ समय में मुक्त किया जाना चाहिए (इसे जीसी में सही होना चाहिए)।चूंकि पाइथन स्वयं ही सही करता है, ओपनसीवी ने किसी अन्य चीज़ को एक और संदर्भ रखा होगा। – Albert
इसके अलावा, 'सीवी = कोई नहीं' वास्तव में समस्या से संबंधित नहीं है। 'सीवी' यहां एक मॉड्यूल है और इसे पायथन से बाहर निकलने पर सही ढंग से मुक्त किया जाता है। – Albert