2012-05-23 4 views
5

이 코드는 마지막 줄까지 잘 동작합니다. 그것은 디스크에 올바른 이미지를 저장하지만 함수 - 힙 손상에서 벗어난 후 "메모리 누수"를 표시합니다. 매트가 명시 적으로 발표 될 필요가 없다는 것을 읽었습니다. 내 경우에는 해제 및 w/o 해제 모두 충돌합니다. 도와주세요. 난 단지 당신에게 지원을 줄 수있는이 작은 정보가 있지만 실제 솔루션을힙 손상 오류; cv :: Mat opencv를 해제 할 수 없습니다.

void CannyEdgeDetectionFilter::applyFilter(Mat& mat, Mat& mixedBandsMat) 
{ 
    //Mat mixedBandsMat; 

    vector<Mat> bandWiseImages; 
    split(mat, bandWiseImages); 

    //! Evaluate numChannels to be filtered in the input image 
    int numChannels = mat.channels(); 
    int type = mat.type(); 

    //! Multiplied by 8 to get bits from Bytes 
    int singleChannelDepth = 8*mat.elemSize1(); 

    for (int i = 0; i < numChannels; i++) 
    { 
     Canny(bandWiseImages[i], bandWiseImages[i], m_LowerThreshold, 
      m_UpperThreshold, m_Kernel.rows); 
    } 

    //! Creating filteredImgMat in order to set DataValues 
    mixedBandsMat.create(mat.rows, mat.cols, mat.type()); 

    //! Unifying the channels back to the output image 
    merge(bandWiseImages, mixedBandsMat); 
#if 1 
    //Release bandWiseImages Mat memory 
    int bandWiseVecSize = bandWiseImages.size(); 
    for(int i = 0; i < bandWiseVecSize; i++) 
     bandWiseImages[i].release(); 
    bandWiseImages.clear(); 
    //fromTo.clear(); 
#endif 
    imwrite("D:\\testAfterCannyEdgeDetetionFilter.jpg", mixedBandsMat); 
    mixedBandsMat.release(); 
} 
+0

어떻게 힙 손상을 감지합니까, 어떤 프로그램을 사용하고 있습니까? 그냥 궁금해 ... – penelope

+0

메모리 누수가 표시되거나 충돌이 발생합니까? – juanchopanza

+0

visual studio 2008에서 작업 중입니다. 코드가 종료되면 함수가 종료됩니다. – user1412066

답변

1

:

1) 난 당신이 Win7에를 사용하고 있다고 생각한다. 따라서 visit Dr. Memory을 입력하고 (경로를 시스템 변수에 추가하여) 설치하십시오. 그런 다음 다음 명령을 사용하여 응용 프로그램을 시작할 수 있습니다 : drmemory.exe -no_follow_children C:\\the_path\\YourExecutable.exe argv[1] ... argv[n]. -no_follow_children은 다른 제 3 자 코드를 무시하는 데 사용됩니다. 이 명령을 실행하십시오. 닥터 메모리는 결과를 C:\Users\NAMEHERE\AppData\Roaming\Dr. Memory\에 기록합니다. 보세요, 아마도 당신은 지금 힌트를 가지고 있습니다. 그렇지 않으면 여기에 게시하십시오. =)

2.) 압축 매개 변수없이 이미지를 쓸 때 OpenCV가 충돌 할 수 있습니다. ++ 나 C에 대한 STL 벡터 [i]를 .release 멤버 함수를 찾을 수 없습니다

vector<int> crparam; 
crparam.push_back(CV_IMWRITE_PNG_COMPRESSION); 
cv::imwrite("D:\\testAfterCannyEdgeDetetionFilter.png", mixedBandsMat, crparam); 
+1

3.) 아니 포인터, NO NO NO! (당신은 내부 refcounts이 방법을 때리고있다). 이미 충분한 부패 문제가있는 사람 – berak

+0

Ok - 아마 지금은 많이. –

+0

얘들 아, 나는 이미지를 디 프리 닝 (멋쟁이) 한 다음 스페이스를 눌러 (바로 그 후) 종료 할 때 충돌이 발생한다. 또한 같은 프로젝트가 1 주일 전에 올바르게 실행되었지만 지금은 충돌 (백업과 동일한 파일)이 발생합니다. 그것은 컴퓨터 때문입니까? 나는 지금 Wins 8을 사용하고있다. –

-2

: 그래서 난 항상 imwrite 기능을 INT-매개 변수의 벡터를 줄이 몇 시간을 경험했습니다. 벡터 [i]를 시도하십시오.

+0

벡터가 아니라 모두 출시 된 매트입니다. – berak