Opencv常见的内存泄露错误


今天花了一个晚上的时间帮一个网友调试opencv的代码,出现了不少错误,其中主要的错误给出它的主函数来分析下:

#include "iostream"
#include "stdio.h"
#include "cv.h"
#include "highgui.h"
//#include "yundongjiance.h"
//#include "zhencha.h"
using namespace std;


void main()
{
 IplImage* pImage=NULL;
 IplImage* n_pImage=NULL;//当前帧图像
 IplImage* m_pImage=NULL;//前一帧图像
 IplImage* n_ch = NULL;
 IplImage* rImage = NULL; //返回图像
 int num=1; //帧数
 //m_pImage = cvCreateImage(cvSize(pImage->width,pImage->height),IPL_DEPTH_8U,3);
 //创建窗口
 cvNamedWindow("video1",1);
    cvNamedWindow("video2",1);
 cvNamedWindow("video3",1);
 //使窗口有序排列bi
 cvMoveWindow("video1",30,0);
 cvMoveWindow("video2",690,0);
 cvMoveWindow("video3",360,400);
 CvCapture *pCapture=cvCaptureFromAVI("01.avi"); //抓取视频文件
 pImage=cvCreateImage(cvSize(432,324),IPL_DEPTH_8U,3);
 for(num=1;num<=10;num++)   //取1000帧
 {
  pImage = cvQueryFrame(pCapture);  //逐帧选取
  if (!pImage) break;
  if(num==1)
  { 
   m_pImage = cvCreateImage(cvSize(pImage->width,pImage->height),IPL_DEPTH_8U,3);
   n_pImage = cvCreateImage(cvSize(pImage->width,pImage->height),IPL_DEPTH_8U,3);
   n_ch = cvCreateImage(cvSize(pImage->width,pImage->height),IPL_DEPTH_8U,3);
   rImage = cvCreateImage(cvSize(pImage->width,pImage->height),IPL_DEPTH_8U,3);
 
   //原点在左上角
   m_pImage->origin=1;
   n_pImage->origin=1;
      n_ch->origin = 1;
  
   m_pImage = cvCloneImage(pImage);

   n_pImage = cvCloneImage(pImage);
   n_ch = cvCloneImage(pImage);
  
  }
  else if(num>1)
  {
 
   m_pImage = cvCloneImage(n_pImage);
   n_pImage = cvCloneImage(pImage);
   n_ch = cvCloneImage(pImage);

   //添加检测代码
  
    //  rImage = zhencha(m_pImage,n_ch);
  // rImage->origin=1;
   cvShowImage("video1",n_pImage);
   cvWaitKey(10);
   cvShowImage("video2",m_pImage);
   cvWaitKey(10);
   cvShowImage("video3",rImage);
   if(cvWaitKey(10)>=0)
   break;
  }
 
 }
 //销毁窗口
  //pImage = cvCloneImage(rImage);

  //cvReleaseImage(&pImage);

 cvReleaseImage(&m_pImage);
 cvReleaseImage(&n_pImage);

 cvReleaseCapture(&pCapture); //抓取视频文件
 cvReleaseImage(&rImage);
 cvReleaseImage(&n_ch);
 cvDestroyWindow("video1");
 cvDestroyWindow("video2");
 cvDestroyWindow("video3");
 //释放图像和矩阵

 return ;

}

闲话少说,下面来说说发生的错误,重点在以下两句代码:

  //pImage = cvCloneImage(rImage);

  //cvReleaseImage(&pImage);

说实话,我至今都只是根据答案来对错误进行的解释,当我们把视频读取完毕的时候,如果后面出现了一句cvReleaseImage(&pImage);那么将会出现内存错误,因为在读取完视频之后pImage指向的是一个空域,使用cvReleaseImage()函数将会出错,但是如果我们加上一句cvCloneImage();函数,将会消除这个错误,所以这就是内存不允许对一个不占用内存的指针去使用cvCloneImage()函数,这也是在内存方面常常出现的错误。还有就是在使用完pCapture后没有使用cvReleaseCapture(&pCapture);函数,也是初学者常常犯的错误,以为这种操作时默认的,所以导致对这种错误不知改从何下手,最后补上一句话,那就是一定要有耐心去学会调试,这个很重要。在此特地写下来分享下。

相关内容