libdecodeqr_0.9.3.orig 内存泄漏修改
2016-11-25 21:07
239 查看
libdecodeqr_0.9.3.orig
libdecodeqr下载介绍这个开源库是一个日本人写的,可以识别QR 二维码识别的。
还有两个二维码识别的库,zbar和zxing。自行寻找
这篇文章主要说说libdecodeqr_0.9.3.orig 库存在内存泄漏的问题。
花了几天逐句排除,总算皇天不负苦心人。
1 作者喜欢把变量内存的释放放在析构函数里面,这样设计代码,的确很好,但是导致局部测试时好麻烦,要去思考每个函数调用完,存在哪些内存申请,哪些需要释放。
2 导致原代码库有内存泄漏主要为以下几点:
作者定义了两个内存管理器作为成员变量,CvMemStorage _stor, CvMemStorage *_stor_tmp。然后代码里面,局部变量例如hull使用完这个内存管理器后,用cvRelease((void *)&hull)来完成hull内存释放,而_stor和_stor_tmp则一直被各种局部变量反复调用。每次调用完都用用cvRelease来释放对应的局部变量。_stor和_stor_tmp则在析构函数中完成最后的释放。
上面是我根据作者的代码大致能想到的解释,说了不要打我,但是问题来,如果用一个while套住如下执行语句,发现内存会泄漏。因为我认为 cvRelease((void *)&markers_vertex)这个释放内存的方法应该不适合CvSeq 。网上搜索会知道其实stor_tmp_markers_vertex和markers_vertex公用一块内存。可以用cvReleaseMemStorage(&stor_tmp_markers_vertex);来释放,此时这两个变量就都失去了内存。当然也可以用cvReleaseMemStorage(&markers_vertex->storage);
CvMemStorage *stor_tmp_markers_vertex = NULL; stor_tmp_markers_vertex = cvCreateMemStorage(0); while(1){ CvSeq *markers_vertex = cvCreateSeq(CV_SEQ_ELTYPE_POINT, sizeof(CvSeq), sizeof(CvPoint), stor_tmp_markers_vertex); cvRelease((void **)&markers_vertex) }
因此我的第一个改动是:
this->_find_code_area_contour(FIND_CODE_AREA_POLY_APPROX_TH);函数发现有问题
:破釜沉舟删除CvMemStorage *_stor;
CvMemStorage *_stor_tmp;然后源码中用到这两个变量,全部单独配一个内存管理器,使用完就删除。PS:因为_seq_code_area_contour要多处使用,因此给他单独创建对应的成员变量CvMemStorage。
2 第二个改动地方:
this->_get_format_info(code_matrix, 0);函数发现有问题
发现里面的成员函数对应的析构函数不规范。
1.
Field::~Field()
{
for (int i = 0; i < this->_pool_size; i++) { if (this->pool[i]){ delete this->pool[i]; } } delete [] this->pool; if(this->_need_delete){ delete this->exp2vect; delete this->vect2exp; } }
在代码 if(hull){} 里面有申请 CvMat* vector=cvCreateMat(1,hullcount,CV_32SC2);因此需要在最后添加 cvReleaseMat(&vector);释放内存
修改后的源码下载
相关文章推荐
- libdecodeqr-0.9.3在ubuntu上移植记录
- 移植EMCV到DM6467(5)——修改encodedecode demo测试算法封装
- VS DLL修改lib生成路径
- 继续对内存泄漏进行分析和修改(原创,绝对的原创)
- matplotlib命令与格式:删除,移动,修改axes脊柱(边框)
- ubuntu 下修改了/usr/lib下导致sudo无法使用
- 直接修改别人jar包里面的class文件 工具:jclasslib
- 直接修改别人jar包里面的class文件 工具:jclasslib
- ubuntu 常见错误--Could not get lock /var/lib/dpkg/lock 问题修改
- Webbrowser内存泄漏解决方案(修改OleCtrls.pas)
- jclasslib Java字节码查看器 修改工具
- librtmp 日志的修改和操作 给android打印
- 直接修改别人jar包里面的class文件 工具:jclasslib
- 【修改jar】jclasslib修改jar包里面的class文件
- Webbrowser内存泄漏解决方案(修改OleCtrls.pas)
- matplotlib模块数据可视化-修改坐标轴位置
- LibAhead for iOS - 在未越狱设备上修改三方APP的功能
- matplotlib中文显示坐标--修改matplotlibrc文件(for windows系统)
- msnlib中的MimeMessage.parse代码需要修改
- 修改VS2010生成的lib和dll文件路径