如果图像返回,我需要cvReleaseImage吗?
Do I need a cvReleaseImage if image is returned?
我正在使用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);
之后在主程序中正确释放内存吗? - 如果你正在使用c++,不要使用
IplImage*
,使用cv::Mat
,它会自动为你管理内存。 - 你的第一个方法创建了一个内存泄漏(这不是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(&...)