OpenCV:Python接口内存泄漏,但C版本中没有

OpenCV:Python接口内存泄漏,但C版本中没有,python,debugging,memory-leaks,opencv,cpython,Python,Debugging,Memory Leaks,Opencv,Cpython,我在这里问这个问题是因为到目前为止我还没有从OpenCV开发人员那里得到任何帮助。我将问题简化为一个非常简单的测试用例,因此可能任何具有CPython相关背景的人都可以在这里提供帮助 此C代码不会泄漏: int main() { while(true) { int hist_size[] = {40}; float range[] = {0.0f,255.0f}; float* ranges[] = {range}; CvH

我在这里问这个问题是因为到目前为止我还没有从OpenCV开发人员那里得到任何帮助。我将问题简化为一个非常简单的测试用例,因此可能任何具有CPython相关背景的人都可以在这里提供帮助

此C代码不会泄漏:

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);
    }
}
此Python代码确实存在漏洞:

while True: cv.CreateHist([40], cv.CV_HIST_ARRAY, [[0,255]], 1)
我搜索了CPython代码(OpenCVs当前SVN主干代码)并发现:

struct cvhistogram_t {
  PyObject_HEAD
  CvHistogram h;
  PyObject *bins;
};

从OpenCV C标题中:

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;
我并不完全理解所有内容,因为我以前从未使用过Python的C接口。但我正在搜索的bug可能就在这段代码的某个地方

我说得对吗?或者我应该在哪里搜索bug?我该怎么修

(请注意,对于看到此问题早期版本的人:我看了错误的代码。他们的SWIG接口已被弃用,不再使用。)(但是代码仍然存在于SVN中,这就是我混淆它的原因。所以不要查看
接口/swig
,这段代码很旧,没有使用过。当前代码存在于
模块/python
中)



我认为您存在垃圾收集问题,因为您从未离开过循环

这是否比预期的更有效

while True: 
    cv.CreateHist([40], cv.CV_HIST_ARRAY, [[0,255]], 1)
    cv = None
已经修好了

3周前由jamesb更改

  • 状态从已接受更改为已关闭
  • 分辨率设置为固定
固定在

没有释放范围参数,范围上的迭代器也没有减少。回归现在通过,原始循环不会泄漏


CreateHist
返回一个对象。因为它没有分配给任何变量,所以应该在将来某个时候释放它(它应该直接进入GC)。由于Python本身就是这样做的,OpenCV必须保留另一个引用。此外,
cv=None
与问题本身并没有真正的关系。
cv
是这里的一个模块,它在退出Python时被正确释放。
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;
while True: 
    cv.CreateHist([40], cv.CV_HIST_ARRAY, [[0,255]], 1)
    cv = None