手动封装OpenCV1.0的IplImage读取保存功能遇到的小问题

最近准备重新学习图像处理的知识,主要目的是自己实现一遍图像处理的算法,所以除了读取、保存图像外的操作都自己写,没想到直接封装OpenCV的读取、保存功能的第一步就出错。关键代码如下

void MyImage::Clear()
{
    if (m_pImg != nullptr)
    {
        std::cout << "释放内存" << std::endl;
        delete m_pImg;
        m_pImg = nullptr;
    }
}

其中m_pImg是IplImage*类型,析构函数调用Clear函数。在主函数里用窗口显示图像,关闭后就成了这样子了

打开图像时没问题,关闭显示窗口后就出现错误。

Debug Assertion Failed!
Expression: _BLOCK_TYPE_IS_VALID(pHead->nBlockUse)

是典型的内存泄露的表现。

原来是OpenCV中对于IplImage的内存释放是严格要用cvReleaseImage函数的,毕竟delete对应的是new,而IplImage*不是用new来申请内存,而是用cvCreateImage或cvLoadImage这种封装了申请内存的方法。所以不能习惯性地对指针用delete,把那段改成cvReleaseImage(&m_pImg);即可

posted @ 2016-03-31 22:29  Harley_Quinn  阅读(1239)  评论(0编辑  收藏  举报