如何防止代码中的内存泄漏

时间:2014-07-18 12:18:31

标签: c opencv

我在cvDilate函数中调用了cvCreateStructuringElementEx()函数(返回IplConvKernel *)。

如果我按照下面的说法调用cvDilate,如何防止内存泄漏?

#include <iostream>
#include <cv.h>
#include <highgui.h>
using namespace std;

int main()
{
  IplImage* topHatImg = cvLoadImage("ff.jpg",0);
  for (size_t i = 0; i < 1000000; i++)
  {
    //memory leak due to repeated call to cvCreateStructuringElementEx()
    //how can I prevent this
    cvDilate(topHatImg, topHatImg,
             cvCreateStructuringElementEx(21, 3, 11, 2, CV_SHAPE_RECT,NULL ));
  }
}

2 个答案:

答案 0 :(得分:3)

要么按照注释中的建议进行,要么在循环中创建IplConvKernel结构:

IplImage* topHatImg = cvLoadImage("ff.jpg",0);
IplConvKernel* convKernel = cvCreateStructuringElementEx(21, 3, 11, 2, CV_SHAPE_RECT,NULL );
for (size_t i = 0; i < 1000000; i++)
{      
  cvDilate(topHatImg, topHatImg,convKernel);
}
// deallocate stuff here
cvReleaseStructuringElement(&convKernel);
cvReleaseImage(&topHatImg);
// ...

我建议您切换到OpenCV C ++ API。

答案 1 :(得分:2)

@KeillRandoris 给出了正确的答案。我为添加另一个非常相似的答案而道歉,但我想更多地讨论这个问题并分享一些代码以便更好地实现可视化。

正如您在问题中所指出的那样,泄漏发生是因为cvCreateStructuringElementEx()在调用时分配动态内存,这意味着如果您在每次迭代时都没有调用cvReleaseStructuringElement()来释放该内存,那么泄漏就是将会发生:

IplImage* topHatImg = cvLoadImage("ff.jpg",0);
for (size_t i = 0; i < 1000000; i++)
{      
    IplConvKernel* element= cvCreateStructuringElementEx(21, 3, 11, 2, CV_SHAPE_RECT,NULL);
    cvDilate(topHatImg, topHatImg, element);
    cvReleaseStructuringElement(&element);
}

cvReleaseImage(&topHatImg);