我的功能如下:
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;
}
答案 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的内存等待,则会出现内存不足错误,这就是您所经历的。