如果返回图像,是否需要cvReleaseImage?

时间:2011-04-14 09:43:56

标签: c++ opencv memory-management

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

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

THX!

编辑: 所以我应该这样称呼这个方法:

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

IplImage* tmp;
tmp = Method1(src);

之后在主程序中正确释放内存?

4 个答案:

答案 0 :(得分:3)

  1. 如果您使用的是C ++,请不要使用IplImage*,请使用cv::Mat,它会自动为您执行内存管理。
  2. 你的第一个方法创建了一个内存泄漏(这不是特定于opencv的 - 你为某些东西分配内存,然后覆盖指针,使它现在无法访问(这意味着你有一个什么都不做的分配,你永远不会释放它。

答案 1 :(得分:2)

不,否则你会返回指向一些释放内存的指针。只需确保名称Method1表示您要返回应在稍后发布的新图片。

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

答案 2 :(得分:1)

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

答案 3 :(得分:0)

通过在此功能之外创建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(&...)