前几天写了很多个图像转换的函数, 都是将源图像的指针作为输入参数, 将转换得到的图像的指针作为返回值, 比如写了个简单的32F的IplImage转为8U的IplImage的函数(中间步骤省略):
IplImage* Ipl32F_to_Ipl8U(IplImage* image32F)
{
IplImage* image8U; //返回值
image8U = cvCreateImage(cvGetSize(image32F), IPL_DEPTH_8U, 1);
/*
转换过程
*/
return image8U;
}
而我调用该函数的语句大致为:
IplImage* img8u = Ipl32F_to_Ipl8U(img32f);
最后手动释放img8u:
cvReleaseImage(&img8u);
这里的内存分配方式相当于是由函数内部的指针image8U分配的图像内存, 然后最后由调用的 img8u 来释放.
当然这样做没有错, 但是发现有很多网上的经验心得都提到, 最好的内存管理方式是谁分配谁释放, 也就是说应该由image8U来销毁内存.
而基于这一原则, 上面的函数应该改为
void Ipl32F_to_Ipl8U(IplImage* image32F, IplImage* image8U)
{
image8U = cvCreateImage(cvGetSize(image32F), IPL_DEPTH_8U, 1);
/*
转换过程
*/
return;
}
基于上面的函数, 调用和释放可按如下:
IplImage* img8u;
Ipl32F_to_Ipl8U(img32f, img8u);
......
cvRelease(img8u);
这样就做到了img8u分配的内存并由其自己释放. 同时函数这样写还有个好处, 若将void改成bool可以用来判断转换过程中是否出现问题.
之前写的很多个图像转换函数中图像内存的操作除了cvCreateImage/cvReleaseImage外, 还包括用malloc/free和new/delete, 函数都可以用上述的方法进行改进, 确保谁分配谁释放的原则.