Утечка памяти в cvCaptureFromCAM? - PullRequest
       29

Утечка памяти в cvCaptureFromCAM?

2 голосов
/ 14 ноября 2011

Оказывается, использование cvCaptureFromCAM создает память при инициализации. Использование cvCaptureFromCAM создает 48-байтовую утечку памяти объекта NSAutoreleasePool. Сначала я думал, что в моей программе есть ошибка, но при замене на гораздо более простую программу утечка памяти все еще происходит.

Например:

#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 для поиска утечек памяти и, очевидно, использую Xcode IDE в Mac OS X 10.6. Кто-нибудь знает решение для утечки? Я делаю что-то не так или это ошибка в OpenCV или проблема с моим компьютером? Я дважды проверил свой код и код OpenCV, но не смог найти проблему. Утечка памяти - одноразовая вещь - она ​​не строит. Однако мне неудобно оставлять ЛЮБЫЕ утечки в моей программе. У кого-нибудь есть предложения?

Ответы [ 3 ]

2 голосов
/ 14 ноября 2011

Я думаю, что проблема в этой части

while (1)
{
   frame = cvQueryFrame (capture);
   cvShowImage ("Output", frame);
}

в моей идее, вы должны изменить это неограниченное время до и для должен быть фиксированный объем памяти, а после для вас нужно использовать

Release();
 or 
EndQuery();

я делаю этот метод вот так

 while (1)
 {
  for(int i=0;i<x;++i)
  {
      frame = cvQueryFrame (capture);
      cvShowImage ("Output", frame);
  }
  Release();
  EndQuery();
 }
1 голос
/ 22 ноября 2011

К сожалению, мне не удалось обнаружить утечку в cvCaptureFromCAM, поэтому я переключился на интерфейс C ++ и использовал объект VideoCapture, который, по-видимому, не имеет утечек.

0 голосов
/ 31 августа 2012

Мне удалось обнаружить утечки памяти с помощью cv::VideoCapture и NSAutoreleasePool.Все проблемы в modules/highgui/src/cap_qtkit.mm.

Я нашел около 3 примеров следующего:

  1. Выделено NSAutoreleasePool.
  2. Метод завершен рано(этот код очень свободно использует ранние возвраты из функций)
  3. Некоторые из этих возвратов не очищаются после использования ранних return

Так что исправление для каждоговхождение [[NSAutoreleasePool alloc] init], проверьте остаток функции для return.Если нет оператора, аналогичного [localpool drain] (или какому-либо имени переменной, использовавшемуся в alloc) непосредственно перед return, добавьте еще один.

Есть еще 2 исходных файла.в highgui, использующем NSAutoreleasePool, у которого могут быть похожие проблемы, но я их не использую и не проверял.

Как только я исправил эту проблему, утечки памяти исчезли.Я снова использую OpenCV 2.4.2.

...