cvCaptureFromCAM内存泄漏

A memory leak in cvCaptureFromCAM?

本文关键字:泄漏 内存 cvCaptureFromCAM      更新时间:2023-10-16

事实证明,使用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::VideoCaptureNSAutoreleasePool的内存泄漏。问题都在modules/highgui/src/cap_qtkit.mm

我发现了以下3个例子:

  1. 已分配1个NSAutoreleasePool
  2. 一个提前退出的方法(这段代码非常自由地使用了函数的早期返回)
  3. 当使用早期的return
  4. 时,其中一些返回值不会自行清理。

所以解决方法是每次出现[[NSAutoreleasePool alloc] init],检查函数的剩余部分是否出现return。如果在return之前没有[localpool drain](或alloc中使用的任何变量名)一行语句,则在

中添加一条。

highgui中还有另外2个使用NSAutoreleasePool的源文件,可能有类似的问题,但我不使用它们,也没有检查过。

一旦我修复了这个问题,我的内存泄漏就消失了。同样,我使用的是OpenCV 2.4.2。