cvrelease 会删除分配的内存吗?

Posted

技术标签:

【中文标题】cvrelease 会删除分配的内存吗?【英文标题】:does cvrelease delete the allocated memory? 【发布时间】:2010-10-27 18:42:05 【问题描述】:

这可能是错误的处理方式,但我将 LabView 中的一个数组作为一个简单的 char 数组传递到我的 C++ 函数中。然后我创建一个 OpenCV 图像并将指针指向我传递的数据。在函数结束时,我使用 cvReleaseImage 删除所有 OpenCV 图像,这会从我的原始指针中删除数据吗?

另外,是否有更好的方法来执行修改原始图像的就地操作?

EXPORT void smoothImg(uchar * the_img, int size_x, int size_y)

 CvSize size;
 size.height = size_y ;
 size.width = size_x;

 IplImage * img1 = cvCreateImageHeader(size, IPL_DEPTH_8U, 1);
 img1->imageData = (char *)the_img;
 img1->imageDataOrigin = img1->imageData;

 IplImage * img2 = cvCreateImage(size, IPL_DEPTH_8U, 1);
// this is because I want my end result to be in img1 (same data as my the_img
 memcpy(img2->imageData,img1->imageData,sizeof(char)*size_x*size_y);

 cvSmooth(img2,img1,CV_BLUR, 5,5);

 cvReleaseImage(&img1 );
 cvReleaseImage(&img2 );


注意:它似乎不会影响我的图像,因为结果是正确的,但我想在我把它放在任何地方之前确保这是正确的

谢谢!

【问题讨论】:

别忘了标记您已经提出的其他问题的答案。 你可以使用 cvCloneImg() 代替 memcpy(),它做同样的事情但可能更合适。 【参考方案1】:

cvRelease 释放图像使用的内存,因此在调用它之后,您将无法再引用该图像。

但是 - 在 openCV 存在之前,其他程序可能无法使用内存,它取决于系统如何处理内存,以及系统何时为其他应用程序返回释放的内存。

编辑:对不起,我没有真正回答你的问题。有一个标志可以传递给 cvCreateImage() 来表示 - 我拥有内存,不要删除它。该标志略微取决于您拥有的 opencv 版本

【讨论】:

【参考方案2】:

我实际上发现了一篇关于 OpenCV 内存分配/释放的非常有趣的文章,我想这意味着我应该使用 cvReleaseImageHeader,因为我只是想删除标题。

http://www.andol.info/hci/963.htm

【讨论】:

以上是关于cvrelease 会删除分配的内存吗?的主要内容,如果未能解决你的问题,请参考以下文章

何时删除返回值的分配内存

我可以删除以前动态分配但使用不同指针的内存吗?

for 循环期间的动态分配会造成内存泄漏吗?

C++ new int[0]——它会分配内存吗?

c语言是在声明变量的同时,分配内存的吗?程序结束运行了,内存会释放吗?

在一个dll里分配的内存,在另一个dll或exe释放会有问题吗?