错用return语句引起的内存泄露

来源:互联网 发布:软件测试培训学费 编辑:程序博客网 时间:2024/06/10 12:36

程序内存泄露问题调试了一两天,所有该释放的资源都仔细检查已经释放,仍然找不到内存泄露问题出在何处。经点拨发现犯了一个很小但是也很致命的错误,再if语句里使用return语句返回值,造成后面的内存释放语句直接被忽略!警示一下,不可以再犯这种低级错误!

贴上修改前后的代码:

laserCenter CCenterDlg::process_image(IplImage* srcImage){laserCenter lasercenter;CvPoint center[6];    CvMemStorage* stor;    CvSeq* cont;//设置默认返回点CvPoint origin;origin.x = Width/2;origin.y = Height/2;for (int k=0;k<6;k++){center[k] = origin;}laserCenter defaultPoint;defaultPoint.center1 = origin;defaultPoint.center2 = origin;defaultPoint.center3 = origin;defaultPoint.center4 = origin;defaultPoint.center5 = origin;defaultPoint.center6 = origin;    // 创建动态结构序列    stor = cvCreateMemStorage(0);    cont = cvCreateSeq(CV_SEQ_ELTYPE_POINT, sizeof(CvSeq), sizeof(CvPoint) , stor);        // 二值话图像.    //cvThreshold( srcImage, copy1, otsu(srcImage), 255, CV_THRESH_BINARY );        // 寻找所有轮廓.    cvFindContours( srcImage, stor, &cont, sizeof(CvContour), CV_RETR_LIST, CV_CHAIN_APPROX_NONE, cvPoint(0,0));    //判断轮廓是否存在,否则返回默认点//int idx = 0;if(cont){cvSeqSort(cont, cmp_func, 0);for(int idx=0;cont&&idx<6;cont=cont->h_next,idx++){center[idx] = searchCenter(cont, srcImage);//center[idx] = origin;}lasercenter.center1 = center[0];lasercenter.center2 = center[1];lasercenter.center3 = center[2];lasercenter.center4 = center[3];lasercenter.center5 = center[4];lasercenter.center6 = center[5];return lasercenter;//错误就在这里啦}elsereturn defaultPoint;cvReleaseMemStorage(&stor);}
修改后的代码,更简洁

laserCenter CCenterDlg::process_image(IplImage* srcImage){laserCenter lasercenter;CvPoint center[6];    CvMemStorage* stor;    CvSeq* cont;//设置默认返回点CvPoint origin;origin.x = Width/2;origin.y = Height/2;for (int k=0;k<6;k++){center[k] = origin;}laserCenter defaultPoint;defaultPoint.center1 = origin;defaultPoint.center2 = origin;defaultPoint.center3 = origin;defaultPoint.center4 = origin;defaultPoint.center5 = origin;defaultPoint.center6 = origin;    // 创建动态结构序列    stor = cvCreateMemStorage(0);    cont = cvCreateSeq(CV_SEQ_ELTYPE_POINT, sizeof(CvSeq), sizeof(CvPoint) , stor);        // 二值话图像.    //cvThreshold( srcImage, copy1, otsu(srcImage), 255, CV_THRESH_BINARY );        // 寻找所有轮廓.    cvFindContours( srcImage, stor, &cont, sizeof(CvContour), CV_RETR_LIST, CV_CHAIN_APPROX_NONE, cvPoint(0,0));    //判断轮廓是否存在,否则返回默认点int idx;if(cont){cvSeqSort(cont, gesContourCompFunc, 0);for(idx=0;cont&&idx<6;cont=cont->h_next,idx++){center[idx] = searchCenter(cont, srcImage);}lasercenter.center1 = center[0];lasercenter.center2 = center[1];lasercenter.center3 = center[2];lasercenter.center4 = center[3];lasercenter.center5 = center[4];lasercenter.center6 = center[5];}elselasercenter = defaultPoint;cvReleaseMemStorage(&stor);return lasercenter;}



0 0