函数传递的内存地址

前几天写了很多个图像转换的函数, 都是将源图像的指针作为输入参数, 将转换得到的图像的指针作为返回值, 比如写了个简单的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, 函数都可以用上述的方法进行改进, 确保谁分配谁释放的原则.

转载于:https://www.cnblogs.com/zxs9wx/archive/2011/12/13/2286286.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值