2013-07-25 1 views
1

은 다음과 같습니다OpenCV의 오류 : 메모리 부족, 함수 호출에 나는 기능이

:

void foo(){ 
    Mat mat(50000, 200, CV_32FC1); 

    /* some manipulation using mat */ 

    } 

여러 루프 (각 루프에서, 한번 foo() 전화) 그런 후, 에러를 제공합니다

OpenCV Error: insufficient memory when allocating (about 1G) memory.

Mat은 로컬이며 foo()이 반환되면 자동으로 할당이 해제되므로 왜 누설되는지 궁금합니다.

일부 데이터는 누출되지만 전부는 아닙니다.

bool VidBOW::readFeatPoints(int sidx, int eidx, cv::Mat &keys, cv::Mat &descs, cv::Mat &codes, int &barrier) { 
    // initialize buffers for keys and descriptors 
    int num = 50000; /// a large number 
    int nDims = 0; /// feature dimensions 


    if (featName == "STIP") 
     nDims = 162; 

    Mat descsBuff(num, nDims, CV_32FC1); 
    Mat keysBuff(num, 3, CV_32FC1); 
    Mat codesBuff(num, 3000, CV_64FC1); 

    // move overlapping codes from a previous window to buffer 
    int idxPre = -1; 
    int numPre = keys.rows; 
    int numMov = 0; /// number of overlapping points to move 

    for (int i = 0; i < numPre; ++i) { 
     if (keys.at<float>(i, 0) >= sidx) { 
      idxPre = i; 
      break; 
     } 
    } 

    if (idxPre > 0) { 
     numMov = numPre - idxPre; 
     keys.rowRange(idxPre, numPre).copyTo(keysBuff.rowRange(0, numMov)); 
     codes.rowRange(idxPre, numPre).copyTo(codesBuff.rowRange(0, numMov)); 
    } 

    // the starting row in code matrix where new codes from the updated features to add in 
    barrier = numMov; 

    // read keys and descriptors from feature file 
    int count = 0; /// number of new points that are read in buffers 
    if (featName == "STIP") 
     count = readSTIPFeatPoints(numMov, eidx, keysBuff, descsBuff); 

    // update keys, descriptors and codes matrix 
    descsBuff.rowRange(0, count).copyTo(descs); 
    keysBuff.rowRange(0, numMov+count).copyTo(keys); 
    codesBuff.rowRange(0, numMov+count).copyTo(codes); 

    // see if reaching the end of a feature file 
    bool flag = false; 

    if (feof(fpfeat)) 
     flag = true; 

    return flag; 
} 
+1

게시 한 코드로는 [문제 재현] (http://SSCCE.org) 할 수 없습니다. 간단하지만 메모리 누수를 나타내는 샘플을 게시하십시오. – Aurelius

답변

1

당신은 당신의 함수를 호출하는 코드를 게시하지 않는, 그래서 이것이 진정한 메모리 누수 여부를 알 수 없습니다 :

여기 내 실제 코드입니다. readFeatPoints() 안에 할당 한 Mat 개체는 올바르게 할당 해제되므로 볼 수있는 메모리 누수가 없습니다.

Mat codesBuff(num, 3000, CV_64FC1);을 선언하십시오. num = 5000으로, 이는 하나의 큰 블록에 1.2 기가 바이트의 메모리를 할당하려고한다는 것을 의미합니다. 또한 라인 codes이 데이터의 일부를 복사

하는 반복 사이 numMove + count 변경의 값이,이 codes의 데이터 버퍼의 재 할당의 원인이됩니다. 값이 충분히 크면 루프 반복을 통해 지속되는 상당한 양의 메모리를 먹을 수도 있습니다. 이 두 가지 모두 heapfragmentation으로 이어질 수 있습니다. 어떤 시점에서 1.2GB의 메모리 덩어리가 존재하지 않는다면, 경험 한 것 인 불충분 한 메모리 오류가 발생합니다.