libdecodeqr_0.9.3.orig 内存泄漏修改

libdecodeqr_0.9.3.orig

libdecodeqr下载介绍
这个开源库是一个日本人写的,可以识别QR 二维码识别的。
还有两个二维码识别的库,zbar和zxing。自行寻找

这篇文章主要说说libdecodeqr_0.9.3.orig 库存在内存泄漏的问题。
花了几天逐句排除,总算皇天不负苦心人。

1 作者喜欢把变量内存的释放放在析构函数里面,这样设计代码,的确很好,但是导致局部测试时好麻烦,要去思考每个函数调用完,存在哪些内存申请,哪些需要释放。

2 导致原代码库有内存泄漏主要为以下几点:

  1. 作者定义了两个内存管理器作为成员变量,CvMemStorage _stor, CvMemStorage *_stor_tmp。然后代码里面,局部变量例如hull使用完这个内存管理器后,用cvRelease((void *)&hull)来完成hull内存释放,而_stor和_stor_tmp则一直被各种局部变量反复调用。每次调用完都用用cvRelease来释放对应的局部变量。_stor和_stor_tmp则在析构函数中完成最后的释放。
  2. 上面是我根据作者的代码大致能想到的解释,说了不要打我,但是问题来,如果用一个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)
            }
  1. 因此我的第一个改动是:

    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;
    }
}
  1. 在代码 if(hull){} 里面有申请 CvMat* vector=cvCreateMat(1,hullcount,CV_32SC2);因此需要在最后添加 cvReleaseMat(&vector);释放内存

  2. 修改后的源码下载

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值