释放内存OpenCV

4
我已经发布了一些关于释放所有IplImage和所有CvMat结构和CvMemStorage的文章,但我仍然有一些内存问题。
我是否还需要释放CvPointCvScalarCvPoint*(3个CvPoints的数组,每个元素都需要释放吗?)
如果我必须释放所有这些东西,我该如何做呢?我没有找到任何可以这样做的函数。我正在使用C/C++中的OpenCV 2.1。
这是我声明它们的方式:
CvScalar b1;
CvScalar f;
float *data=(float*)resd->imageData; (need to release data)
CvPoint *point;
CvPoint pt;
CvPoint* ptsCorner=(CvPoint*) malloc(3*sizeof(ptsCorner[0]));   
3个回答

5

这个问题与OpenCV相比更加与C语言相关。例如:

CvScalar b1;
CvScalar f;
CvPoint pt;

局部变量是自动分配内存的,当它们所属的作用域 { } 执行结束时,它们会被自动释放。

例如:

CvPoint *point;

这是一个指针,同时也是一个本地变量。你不应该使用deletefree()来释放它,因为你没有通过newmalloc()来分配内存。这样做会导致问题(可能会崩溃)。

但是另一方面,data

float *data = (float*)resd->imageData;

这是一个指针和本地变量,用于保存内存块。然而,在这种情况下,不明智的做法是delete[] data;free(data),因为您没有直接分配这个内存。很显然,这个内存是作为resd的一部分分配的,这意味着您需要检查代码并找出变量resd是如何声明/初始化的,然后进行适当的程序以释放它。由于我对OpenCV有一些了解,我可以告诉你resd是一个IplImage*。如果您使用cvCreateImage()创建这个变量,那么您也需要使用cvReleaseImage()来释放它。

最后:

CvPoint* ptsCorner=(CvPoint*) malloc(3*sizeof(ptsCorner[0]));  

这是动态内存分配的典型案例,您可以专门分配一定数量的内存。由于ptsCorner是一个本地变量和指针,当它所属的范围完成执行时,您将失去对该内存块的引用,它将简单地消失在您的RAM中,占用内存空间并导致泄漏。毋庸置疑,在这种情况下,您必须执行free()来释放内存。


1
如果你使用new来初始化CVPoint结构体,那么是的,你需要调用delete(或者delete[]如果它是一个数组)来避免内存泄漏。
如果不是这样的话,当函数超出作用域时,变量将会自动销毁。
如果你发布你的代码,那么我们可以更容易地看到问题所在。

添加声明,所有的代码都很长,但我认为现在更清晰了,顺便说一下我没有使用new,所以我想我必须释放只是float data(我尝试使用delete,但我得到了运行时错误)和ptsCorner。 - andrea
在使用malloc的地方,您需要使用free()来回收内存。如果它是一个数组,请注意需要对数组的每个成员调用free()。有很多关于如何做到这一点的教程。 - TomP89

0

我认为解决你的问题最好的方法是阅读一篇关于指针的好教程。

这里有一个http://www.cplusplus.com/doc/tutorial/pointers/

你所说的OpenCV问题实际上是对编程语言理解不足。因此,从基础开始学起,逐步深入!


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接