2014-07-18 2 views
2

cvDate 함수 내에서 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? 그러면 자동 topHatImg (std :: unique_ptr (cvLoadImage ("ff.jpg", 0)), ' –

+1

OpenCV에 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

안녕하세요 @ 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); 
관련 문제