事实证明,使用cvCaptureFromCAM会在初始化时创建内存。使用cvCaptureFromCAM会创建NSAutoreleasePool对象的48字节内存泄漏。我最初认为我的程序有一个bug,但是当用一个更简单的程序替换时,内存泄漏仍然会发生。
例如:
#include <opencv2/opencv.hpp>
int main()
{
IplImage *frame = 0;
CvCapture *capture = cvCaptureFromCAM (-1); //leak occurs on this line
//using 0 instead of -1 creates a leak too
cvNamedWindow ("Output", CV_WINDOW_AUTOSIZE);
while (1)
{
frame = cvQueryFrame (capture);
cvShowImage ("Output", frame);
}
cvDestroyAllWindows ();
cvReleaseCapture (&capture);
return 0;
}
我正在使用Xcode Leaks查找内存泄漏,显然在Mac OS X 10.6上使用Xcode IDE。有谁知道泄漏的解决方案?我做错了什么,或者是OpenCV中的错误或我的电脑有问题?我仔细检查了我的代码和OpenCV代码,但实际上找不到问题。内存泄漏是一次性的事情 - 它不会继续构建。但是我不喜欢在我的程序中留下任何泄漏。有没有人有什么建议?
答案 0 :(得分:2)
我认为问题在于这部分
while (1)
{
frame = cvQueryFrame (capture);
cvShowImage ("Output", frame);
}
在我的想法中你必须将这个无限的WHILE改为FOR和 因为必须要修复内存大小,之后必须使用
Release();
or
EndQuery();
我这样做这个方法
while (1)
{
for(int i=0;i<x;++i)
{
frame = cvQueryFrame (capture);
cvShowImage ("Output", frame);
}
Release();
EndQuery();
}
答案 1 :(得分:1)
遗憾的是我无法在cvCaptureFromCAM中找到泄漏,因此我切换到C ++界面并使用了一个VideoCapture对象,该对象似乎没有泄漏。
答案 2 :(得分:0)
我能够找到cv::VideoCapture
和NSAutoreleasePool
的内存泄漏。这些问题都在modules/highgui/src/cap_qtkit.mm
。
我发现了以下3个例子:
NSAutoreleasePool
。return
因此修复是针对[[NSAutoreleasePool alloc] init]
的每次出现,检查函数的剩余部分是否为return
。如果在[localpool drain]
之前没有return
(或者在alloc中使用的任何变量名称)的语句,则添加一个。
highgui中有2个其他源文件使用NSAutoreleasePool
可能有类似的问题,但我没有使用它们并且没有检查过。
一旦我解决了这个问题,我的内存泄漏就消失了。我再次使用OpenCV 2.4.2。