and*_*rea 4 c c++ opencv memory-leaks
我已经发布了一些关于释放所有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]));
Run Code Online (Sandbox Code Playgroud)
这个问题比OpenCV更加C相关.例如,这些:
CvScalar b1;
CvScalar f;
CvPoint pt;
Run Code Online (Sandbox Code Playgroud)
是局部变量,因此当{ }它们所属的范围完成执行时,它们会自动处理.
这个:
CvPoint *point;
Run Code Online (Sandbox Code Playgroud)
是一个指针,同时是一个局部变量.你不应该delete或free()它,因为你没有通过new或分配任何内存malloc().这样做会导致问题(可能是崩溃).
但data另一方面:
float *data = (float*)resd->imageData;
Run Code Online (Sandbox Code Playgroud)
是一个包含内存块的指针和局部变量.然而,这不是明智的,delete[] data;或free(data)在这种特殊情况下,因为你没有直接分配此内存.很明显,这个内存是作为一部分分配的resd,这意味着你必须检查代码并找出如何resd声明/初始化变量,然后执行相应的过程来释放它.因为我对OpenCV知之甚少,我可以说它resd是一个IplImage*.如果你曾经cvCreateImage()创建过这个变量,那么你的工作就是释放它cvReleaseImage().
最后:
CvPoint* ptsCorner=(CvPoint*) malloc(3*sizeof(ptsCorner[0]));
Run Code Online (Sandbox Code Playgroud)
这是动态内存分配的典型案例,您可以专门分配一定量的内存.由于它ptsCorner是一个局部变量和一个指针,当它所属的范围完成执行时,你将失去对该内存块的引用,它将在你的RAM中丢失,造成内存空间并导致泄漏.不用说,free()在这种情况下你必须执行以释放内存.