OpenCV错误:函数调用中内存不足

时间:2013-07-25 17:48:52

标签: c++ opencv

我的功能如下:

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

     /* some manipulation using mat */

     }

然后在几个循环之后(在每个循环中,我调用foo()一次),它会出错:

  

OpenCV错误:分配(约1G)内存时内存不足。

根据我的理解,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 个答案:

答案 0 :(得分:1)

你没有发布调用你的函数的代码,所以我不知道这是否是真正的内存泄漏。您在Mat内分配的readFeatPoints()对象将被正确释放,因此我无法看到内存泄漏。

您声明Mat codesBuff(num, 3000, CV_64FC1);。使用num = 5000,这意味着您尝试在一个大块中分配1.2千兆字节的内存。您还可以使用以下行将部分此类数据复制到codes

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

如果numMove + count的值在迭代之间发生变化,这将导致codes中数据缓冲区的重新分配。如果值足够大,您可能也会占用大量内存,这些内存会在循环的迭代中持续存在。这两件事都可能导致heap fragmentation。如果在任何时候都不存在1.2 GB的内存等待,则会出现内存不足错误,这就是您所经历的。