错用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
- 错用return语句引起的内存泄露
- CreateThread引起的内存泄露
- Backtraces引起的内存泄露
- Handler 引起的内存泄露
- Handler 引起的内存泄露
- Handler 引起的内存泄露
- Handler 引起的内存泄露
- Handler 引起的内存泄露
- scanf 引起的内存泄露
- Handler引起的内存泄露
- Handler 引起的内存泄露
- Handler引起的内存泄露
- Android_Handler引起的内存泄露
- Android_Handler引起的内存泄露
- Handler 引起的内存泄露
- Handler引起的内存泄露
- Handler 引起的内存泄露
- Handler引起的内存泄露
- test
- Eclipse for Mac 配置JDK1.8
- 从vivado 2013.4到vivado 2015.2的搬迁笔记
- 人群拥挤检测之人数检测二
- lua内存优化
- 错用return语句引起的内存泄露
- Discuz 论坛设置发帖最大字数
- Android APK反编译就这么简单 详解(附图)
- VC++ListBox(列表框)的使用
- Linux系统信息查看命令
- Oracle查询树形结构
- php 中利用json_encode和json_decode传递包含特殊字符的数据
- 【计算机与社会知识】从一到多
- [php] 面包屑导航2