释放内存opencv

时间:2012-01-25 09:30:07

标签: c++ c opencv memory-leaks

我已经发布了一些关于发布所有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 个答案:

答案 0 :(得分: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有点了解,我可以说resdIplImage*。如果您使用cvCreateImage()创建此变量,那么使用cvReleaseImage()释放它也是您的工作。

最后:

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

这是动态内存分配的典型案例,您可以专门分配一定量的内存。由于ptsCorner是一个局部变量和一个指针,当它所属的范围完成执行时,你将松开对该内存块的引用,它将在你的RAM中丢失,造成内存空间并导致泄漏。不用说,在这种情况下你必须执行free()来解除分配内存。

答案 1 :(得分:1)

如果您使用初始化CVPoint结构,那么您需要调用删除(或删除[] ,如果它是数组)以避免泄漏记忆。

如果没有,那么当函数超出范围时,变量将自动销毁。

如果您发布代码,则会更容易看到。

答案 2 :(得分:0)

我认为解决问题的最佳方法是阅读有关指针的好教程。

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

你说的有OpenCV问题,实际上是缺乏对编程语言的理解。所以,从基础开始,广告继续!