我已经发布了一些关于发布所有IplImage
和所有CvMat
结构以及CvMemStorage
的帖子,但我仍然遇到了一些内存问题。
我是否还必须发布CvPoint
,CvScalar
,CvPoint*
(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]));
答案 0 :(得分:5)
这个问题比OpenCV更具C相关性。例如,这些:
CvScalar b1;
CvScalar f;
CvPoint pt;
是局部变量,因此当它们所属的范围{ }
完成执行时,它们会自动处理。
此:
CvPoint *point;
是一个指针,同时也是一个局部变量。您不应该delete
或free()
,因为您没有通过new
或malloc()
为其分配任何内存。这样做会导致问题(可能是崩溃)。
但另一方面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 :(得分:1)
如果您使用新初始化CVPoint结构,那么您需要调用删除(或删除[] ,如果它是数组)以避免泄漏记忆。
如果没有,那么当函数超出范围时,变量将自动销毁。
如果您发布代码,则会更容易看到。
答案 2 :(得分:0)
我认为解决问题的最佳方法是阅读有关指针的好教程。
这是一个http://www.cplusplus.com/doc/tutorial/pointers/
你说的有OpenCV问题,实际上是缺乏对编程语言的理解。所以,从基础开始,广告继续!