这段代码c ++ opencv中的内存泄漏在哪里?

时间:2012-06-22 07:12:50

标签: memory-management opencv memory-leaks

这是代码

CvMemStorage *mem123 = cvCreateMemStorage(0);
CvSeq* ptr123;CvRect face_rect123;
CvHaarClassifierCascade* cascade123 = (CvHaarClassifierCascade*)cvLoad("haarcascade_frontalface_alt2.xml" );    //detects the face if it's frontal
void HeadDetection(IplImage* frame,CvRect* face){
    ptr123=cvHaarDetectObjects(frame,cascade123,mem123,1.2,2,CV_HAAR_DO_CANNY_PRUNING);
    if(!ptr123){return ;}
    if(!(ptr123->total)){return ;}
    face_rect123=*(CvRect*)cvGetSeqElem( ptr123, 0 );   //CvRect face_rect holds the position of Rectangle
    face->height=face_rect123.height;
    face->width=face_rect123.width;
    face->x=face_rect123.x;
    face->y=face_rect123.y;
    return ;
}//detects the position of head and it is fed in CvRect*face as rectangle
int main(){
    IplImage* oldframe=cvCreateImage(cvSize(640,480),8,3);
    CvCapture* capture=cvCaptureFromCAM(CV_CAP_ANY);
    CvRect a;a.height=0;a.width=0;a.x=0;a.y=0;
    while(1){

        oldframe=cvQueryFrame(capture); //real frame captured of size 640x480
        cvFlip(oldframe,oldframe,1);
        cvResize(oldframe,frame);   //frame scaled down 4 times 
        HeadDetection(frame,&a);
        cvShowImage("frame",frame);
        cvWaitKey(1);
    }
}

这里是“HeadDetection(frame,& a);”注释,然后使用任务管理器,我看到angledetection.exe(我的项目的名称)消耗20188 Kb内存(然后没有发生内存泄漏)。

但是,如果我不评论任务管理器显示发生了一些内存泄漏(大约300Kb / s)

我在64位Windows 7位操作系统(核心2二重奏)上使用VS 2010。

此代码试图通过OpenCV 2.1中的haar检测来检测面部并获得方形的四个角落

如果有任何不清楚的地方请询问。 : - )

提前致谢。

1 个答案:

答案 0 :(得分:1)

当您致电cvHaarDetectObjects时,您正在获取指向对象的指针。

但你永远不会释放它( ptr123 指向的对象)。

face_rect123 也未获释。

顺便说一句,你应该考虑重构代码并为变量提供更好的名称。