OpenCV:Python接口内存泄漏,但C版本中没有
我在这里问这个问题是因为到目前为止我还没有从OpenCV开发人员那里得到任何帮助。我将问题简化为一个非常简单的测试用例,因此可能任何具有CPython相关背景的人都可以在这里提供帮助 此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
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