您的位置:首页 > 运维架构

opencv中cvLoadImage和cvCloneImage的内存泄露问题

2014-08-27 10:19 169 查看
在程序中循环调用cvLoadImage函数的时候,有可能会出现内存溢出,而使程序崩溃。虽然在程序最后使用了cvReleaseImage进行了释放,但是还是不能成功释放。好的解决办法就是使用CvvImage类来代替。但是高版本的opencv是不具有这个类的,可以通过加载CvvImage.h和CvvImage.cpp文件,将类添加到工程文件中。然后利用该类的Load和GetImage来加载图像数据,并转换为IplImage图像指针。

CvvImage src;
IplImage *psrcImg;
psrcImg=cvCreateImage(cvSize(width,height),IPL_DEPTH_8U,3);
src.Load(strName);
psrcImg=src.GetImage();

cvReleaseImage(&psrcImg);
src.Destroy();


cvCloneImage函数:

这个函数也会出现内存泄露!虽然可以释放,但程序复杂不知道在那里释放,因为它每次拷贝是制作图像的完整拷贝包括头、ROI和数据。不会覆盖以前的内容。每次使用时编译器会分配内存空间。

在使用cvCloneImage()的时候,其实是对源图像指针所指向的图像头、数据、ROI等进行了一个完全的拷贝,放在一个新的内存区域,函数结果使得目标图像指向新的内存,而原来用cvCreateImage()所分配的区域没有被正确释放,成为一片“悬挂地址区域”。在后面调用cvReleaseImage()的时候,释放的是后面其所指向的区域。

因此,要避免这种情况的出现,一种方法是:可以在cvCloneImage()前,先调用cvReleaseImage()来释放之前分配的地址区域。然后执行克隆函数cvCloneImage()操作。也可以在前面不分配空间,直接调用克隆操作。另外一种方法,如果使用cvCopy()函数操作,由于该函数并不会对图像指针分配空间,所以需要先自己用cvCreateImage()分配一段区域,然后调用拷贝函数cvCopy(),来对图像赋值。这样最后释放的是图像指针所指的地址区域。这两种方法都不会出现内存泄露的问题了。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: