2

我在这段代码中遇到了内存泄漏,我无法找到我做错了什么。

CvCapture* capture = cvCaptureFromFile([[url path] UTF8String]);

while (cvGrabFrame(capture)) {    
  IplImage *frame = cvRetrieveFrame(capture);

  if (frame) {
    [...]
  } else {
    break;
  }
}

cvReleaseCapture(&capture);

如果我删除 cvRetrieveFrame,内存泄漏就会消失。如果我用一个 cvQueryFrame 更改 cvGrabFrame 和 cvRetrieveFrame 会发生相同的行为。

启用或注释掉 cvReleaseCapture 时的行为相同。所以这可能与此有关,但我无法弄清楚是什么。

我在 iOS 上使用 openCV r7286。

4

4 回答 4

2

这是openCV中的一个错误。最新的主干中提供了修复程序。

于 2012-04-26T10:08:48.157 回答
1

做这样的事情怎么办?

IplImage *frame;
while (cvGrabFrame(capture)) 
{  
     frame = cvRetrieveFrame(capture);    
     if (frame) {     [...]   } 
     else {     break;   } 
}

只声明一个指针,不多

于 2012-07-13T06:28:12.833 回答
0

cvRetrieveFrame 不会做很复杂的事情。我想您在这部分代码中泄漏了内存:

if (frame) {
 [...]
}

你有多确定那部分没有泄漏内存?愿意分享那一点吗?

于 2012-04-22T22:49:57.427 回答
0

在 while 循环上方声明 IplImage* 帧一次。或者在每次迭代后释放分配的帧指针。

于 2015-04-19T10:46:33.807 回答