2014-07-18 41 views
2

我已经在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)); 
    } 
} 
+1

C++ 11?然后'auto topHatImg(std :: unique_ptr (cvLoadImage(“ff.jpg”,0));' –

+1

您可以尝试使用OpenCV的C++接口,这将为您处理内存管理,否则将其标记为C – juanchopanza

+0

为什么要投票? – Deepak

回答

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。

+0

我的疑问是除此之外还有其他方法 – Deepak

+0

+1发现了。诀窍是调用'cvReleaseStructuringElement()'释放内存,但在这种情况下还有另一种使用方法。 – karlphillip

+0

Hi @ user_12如果这个或任何答案解决了你的问题,请考虑通过点击复选标记来接受它。这向更广泛的社区表明,您已经找到了解决方案,并为答复者和您自己提供了一些声誉。没有义务这样做。 –

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);