如果图像返回,我需要cvReleaseImage吗?

Do I need a cvReleaseImage if image is returned?

本文关键字:cvReleaseImage 图像 返回 如果      更新时间:2023-10-16

我正在使用OpenCV 2.2,我想知道如果返回图像,我是否必须释放我为图像分配的内存。我有method1(见下文),它从主程序调用了几次。它返回一个在方法内部创建的IplImage。我必须在哪里释放方法中创建的图像?如果我在返回命令之前释放它,我猜什么都不会返回?执行return命令后,将不进行处理。那么我如何摆脱我的程序运行期间创建的所有dst图像??

IplImage* Method1(IplImage* src) {
 IplImage *dst = cvCreateImage(cvSize(src->width, src->height), IPL_DEPTH_8U, 1);
 [...]
 return dst;
}

谢谢!

编辑:我应该这样调用这个方法吗?

IplImage* tmp;
tmp = cvCreateImage(cvSize(dst->width, dst->height), IPL_DEPTH_8U, 1);
tmp = Method1(src);

IplImage* tmp;
tmp = Method1(src);
之后在主程序中正确释放内存吗?
  1. 如果你正在使用c++,不要使用IplImage*,使用cv::Mat,它会自动为你管理内存。
  2. 你的第一个方法创建了一个内存泄漏(这不是openv特定的-你为某些东西分配内存,然后覆盖指针,所以它现在是不可访问的(这意味着你有一个分配什么都不做,你将永远无法释放它。

不,否则您将返回指向某些已释放内存的指针。只要确保名称Method1表明您将返回一个稍后应该发布的新图像。

你必须在外面的某个地方释放它(一旦你完成了它)。

可以在函数内分配内存。使用dst后,在调用函数中返回图像后,可以调用cvReleaseImage(&dst)来清除内存

通过在函数的之外创建dst映像来消除内存泄漏,如下所示:

void Method1(IplImage* src, IplImage* &dst) {
 [...]
}
IplImage* image0 = ...;
IplImage* image1 = cvCreateImage(cvSize(image0->width, image0->height), IPL_DEPTH_8U, 1);
Method1(image0, image1);   

不要忘记在之后的两个图像上使用cvReleaseImage(&...)