gpt4 book ai didi

c++ - 释放内存opencv

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:38:48 26 4
gpt4 key购买 nike

我已经发布了一些关于释放所有 IplImage 和所有 CvMat 结构和 CvMemStorage 的帖子,但我仍然有一些内存问题。

我是否还必须释放 CvPointCvScalarCvPoint*(3 个 CvPoint 的数组,我是否也必须释放每个元素?)

如果我必须发布所有这些东西,我该怎么做?我没有找到这样做的任何功能。我在 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]));

最佳答案

这个问题比 OpenCV 更与 C 相关。例如,这些:

CvScalar b1;
CvScalar f;
CvPoint pt;

是局部变量,因此当它们所属的范围 { } 完成执行时,它们会自动释放。

这个:

CvPoint *point;

是一个指针,同时也是一个局部变量。你不应该 deletefree() 它,因为你没有通过 newmalloc() 为它分配任何内存。这样做会给您带来麻烦(可能是崩溃)。

但另一方面数据:

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

是一个指针和局部变量,保存着一个内存块。但是,在这种特定情况下,delete[] data;free(data) 是不明智的,因为您没有直接分配此内存。很明显,这 block 内存是作为 resd 的一部分分配的,这意味着您必须检查代码并找出变量 resd 是如何声明/初始化的,然后执行适当的程序来释放它。由于我对 OpenCV 略知一二,所以我可以看出 resd 是一个 IplImage*。如果您使用 cvCreateImage() 创建此变量,那么您也需要使用 cvReleaseImage() 释放它。

最后:

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

这是动态内存分配的典型案例,您可以在其中专门分配一定数量的内存。由于 ptsCorner 是一个局部变量和一个指针,当它所属的作用域完成执行时,您将失去对该内存块的引用,它只会在您的 RAM 中丢失,消耗内存空间并导致泄露。不用说,在这种情况下,您必须执行 free() 来释放内存。

关于c++ - 释放内存opencv,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9000338/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com