OpenCV中对于cvCreateImage和cvReleaseImage的一些小理解

        最近在做一个机械手视觉系统标定的项目,图像方面用的是OpenCV,近些天老是偶尔出现内存方面的问题,很疑惑,发现原因后感慨自己实在是太菜了。

        由于待处理的图像都是灰度图像,对于一般IplImage*结构的初始化是这样的:

IplImage* pImage=cvCreateImage(size,depth,channel);

        释放是这样的:

cvReleaseImage(&pImage);

我为了方便,自定义了函数:

void CreateImage(IplImage* pImage,int nWidth,int nHeight)

{

         pImage=cvCreateImage(cvSize(nWidth,nHeight),IPL_DEPTH_8U,1);

}

void ReleaseImage(IplImage*pImage)

{

        cvReleaseImage(&pImage);

}

我这样调用:

IplImage*m_pImage=NULL;

CreateImage(m_pImage,500,500);

        结果发现初始化无效,仔细一想,原来cvCreateImage的实质是先分配内存,再返回这片内存的指针,那么对于上述两句,在函数内部,开始时pImage=m_pImage,调用了cvCreateImage后,pImage这个临时指针变量指向了新开辟的内存,而此时m_pImage仍然指向空,也就是初始化时的NULL,导致初始化无效。

        同样的,如果事先为m_pImage分配了内存,释放时调用函数如下:

ReleaseImage(m_pImage);

        结果发现,m_pImage本身没有被释放,但是它的成员imageData的内容发生改变,事实上它的数据已经被释放,本身又没有置成NULL,如果有其他指针指向了这部分内存块,由于我们在使用m_pImage之前,往往会通过if语句判断其是否为NULL来确定其状态,如果发现它不是NULL,就有可能对这块内存进行误操作,造成意想不到的结果。

        所以使用指针要额外小心,自定义形参为指针的函数时也需要特别注意。

你可能感兴趣的:(OpenCV中对于cvCreateImage和cvReleaseImage的一些小理解)