您的位置:首页 > 其它

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);释放内存

修改后的源码下载
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息