1

I have a function looks like this:

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

     /* some manipulation using mat */

     }

Then after several loops (in each loop, I call foo() once), it gives an error:

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

In my understanding, the Mat is local and once foo() returns, it is automatically de-allocated, so I am wondering why it leaks.

And it leaks on some data, but not all of them.

Here is my actual code:

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
  • 1
    The code you posted isn't enough to reproduce the problem. Please post a sample that is simple but demonstrates the memory leak. Commented Jul 25, 2013 at 17:55

1 Answer 1

1

You don't post the code that calls your function, so I can't tell whether this is a true memory leak. The Mat objects that you allocate inside readFeatPoints() will be deallocated correctly, so there are no memory leaks that I can see.

You declare Mat codesBuff(num, 3000, CV_64FC1);. With num = 5000, this means you're trying to allocate 1.2 gigabytes of memory in one big block. You also copy some of this data to codes with the line:

codesBuff.rowRange(0, numMov+count).copyTo(codes);

If the value of numMove + count changes between iterations, this will cause reallocation of the data buffer in codes. If the value is large enough, you may also be eating up a significant amount of memory that persists across iterations of your loop. Both of these things may be leading to heap fragmentation. If at any point there doesn't exist a 1.2 GB chunk of memory waiting around, an insufficient memory error occurs, which is what you have experienced.

Sign up to request clarification or add additional context in comments.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.