cvCaptureFromCAM内存泄漏
A memory leak in cvCaptureFromCAM?
事实证明,使用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泄漏来查找内存泄漏,并且显然在Mac OS X 10.6上使用Xcode IDE。有谁知道解决泄漏的办法吗?我做错了什么,或者它是一个bug在OpenCV或问题与我的计算机?我仔细检查了我的代码和OpenCV代码,但没有发现问题。内存泄漏是一次性的——它不会一直累积下去。然而,我不愿意在我的程序中留下任何泄漏。有人有什么建议吗?
我想问题出在这部分
while (1)
{
frame = cvQueryFrame (capture);
cvShowImage ("Output", frame);
}
在我的想法中,你必须把这个无限制的WHILE改为FOR和For必须是固定内存大小之后,你必须使用
Release();
or
EndQuery();
我这样做
while (1)
{
for(int i=0;i<x;++i)
{
frame = cvQueryFrame (capture);
cvShowImage ("Output", frame);
}
Release();
EndQuery();
}
我很不幸地无法找到cvCaptureFromCAM中的泄漏,因此我切换到c++接口并使用videoccapture对象,这似乎没有泄漏。
我能够找到cv::VideoCapture
和NSAutoreleasePool
的内存泄漏。问题都在modules/highgui/src/cap_qtkit.mm
我发现了以下3个例子:
- 已分配1个
NSAutoreleasePool
。 - 一个提前退出的方法(这段代码非常自由地使用了函数的早期返回)
- 当使用早期的
return
时,其中一些返回值不会自行清理。
所以解决方法是每次出现[[NSAutoreleasePool alloc] init]
,检查函数的剩余部分是否出现return
。如果在return
之前没有[localpool drain]
(或alloc中使用的任何变量名)一行语句,则在
highgui中还有另外2个使用NSAutoreleasePool
的源文件,可能有类似的问题,但我不使用它们,也没有检查过。
一旦我修复了这个问题,我的内存泄漏就消失了。同样,我使用的是OpenCV 2.4.2。
- C++功能泄漏内存,我是C++新手,不确定如何解决
- 我的堆栈弹出式磁带的实现是否泄漏内存?
- 将 c++ 向量转换为字符 ** 而不会泄漏内存
- 析构函数 C++ 使泄漏内存
- 构造函数对象赋值是否泄漏内存
- corba :: orb_init泄漏内存
- Gmock泄漏内存
- 如何在不泄漏内存的情况下删除链接列表
- Visual C ODBC关闭记录集泄漏内存
- 为什么泄漏内存比在动态数组上执行 delete[] 慢
- OpenGL正在泄漏内存.哪个对象未释放
- 可以std ::退出泄漏内存
- uiautomation findall泄漏内存
- 为什么在此OpenCL代码中泄漏内存,为什么要泄漏内存
- pthread在完成后会泄漏内存
- win32 标准::线程泄漏内存
- 返回指向同一变量的指针是否会泄漏内存
- 使用clectType(new any_type())可能会泄漏内存泄漏
- Windows开发:如何确定我的应用程序是否正在泄漏内存
- WinHttp打开泄漏内存