2010-11-14 10 views
7

में नहीं, मैं यहां पूछ रहा हूं क्योंकि मुझे ओपनसीवी डेवलपर्स से अब तक कोई मदद नहीं मिली है। मैंने समस्या को एक बहुत ही सरल परीक्षण मामले में कम कर दिया ताकि शायद सीपीथॉन के साथ कुछ पृष्ठभूमि वाले किसी भी व्यक्ति की मदद कर सके।ओपनसीवी: पायथन इंटरफ़ेस के साथ मेमोरी लीक लेकिन सी संस्करण

इस सी कोड लीक नहीं करता:

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

उत्तर

2

यह तय किया गया है।

jamesb द्वारा 3 सप्ताह पहले बदला गया

  • स्थिति r4526

    पर्वतमाला मापदंडों में बंद कर दिया

  • संकल्प तय

फिक्स्ड करने के लिए सेट करने के लिए स्वीकार किए जाते हैं से बदल किया जा रहा नहीं कर रहे थे मुक्त, और सीमाओं पर इटेटरेटर DECREF'ed नहीं किया जा रहा था। रिग्रेशन अब पास हो जाते हैं, और मूल पाश रिसाव नहीं करता है।

0

मुझे लगता है कि आपके पास कचरा संग्रहण मुद्दा है, कि आप कभी नहीं छोड़ लूप

क्या यह अपेक्षा के अनुसार अधिक काम करता है?

while True: 
    cv.CreateHist([40], cv.CV_HIST_ARRAY, [[0,255]], 1) 
    cv = None 
+0

'CreateHist' एक ऑब्जेक्ट देता है। क्योंकि यह किसी भी चर के लिए असाइन नहीं किया गया है, इसे भविष्य में कुछ समय में मुक्त किया जाना चाहिए (इसे जीसी में सही होना चाहिए)।चूंकि पाइथन स्वयं ही सही करता है, ओपनसीवी ने किसी अन्य चीज़ को एक और संदर्भ रखा होगा। – Albert

+0

इसके अलावा, 'सीवी = कोई नहीं' वास्तव में समस्या से संबंधित नहीं है। 'सीवी' यहां एक मॉड्यूल है और इसे पायथन से बाहर निकलने पर सही ढंग से मुक्त किया जाता है। – Albert