cvCaptureFromCAM中的内存泄漏?

时间:2011-11-14 00:34:25

标签: c++ debugging video memory-leaks opencv

事实证明,使用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代码,但实际上找不到问题。内存泄漏是一次性的事情 - 它不会继续构建。但是我不喜欢在我的程序中留下任何泄漏。有没有人有什么建议?

3 个答案:

答案 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::VideoCaptureNSAutoreleasePool的内存泄漏。这些问题都在modules/highgui/src/cap_qtkit.mm

我发现了以下3个例子:

  1. 分配了NSAutoreleasePool
  2. 早期退出的方法(此代码非常自由地使用函数的早期返回)
  3. 使用早期return
  4. 时,其中一些回复不会自行清理

    因此修复是针对[[NSAutoreleasePool alloc] init]的每次出现,检查函数的剩余部分是否为return。如果在[localpool drain]之前没有return(或者在alloc中使用的任何变量名称)的语句,则添加一个。

    highgui中有2个其他源文件使用NSAutoreleasePool可能有类似的问题,但我没有使用它们并且没有检查过。

    一旦我解决了这个问题,我的内存泄漏就消失了。我再次使用OpenCV 2.4.2。