我在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 ));
}
}
答案 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);