2

このコードでメモリリークが発生し、何が間違っているのかを見つけることができません。

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

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

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

cvReleaseCapture(&capture);

cvRetrieveFrameを削除すると、メモリリークがなくなります。1つのcvQueryFrameでcvGrabFrameとcvRetrieveFrameを変更すると、同じ動作が発生します。

動作は、cvReleaseCaptureが有効またはコメントアウトされている場合と同じです。おそらくそれに関連するものですが、私には何がわかりません。

iOSでopenCVr7286を使用しています。

4

4 に答える 4

2

これはopenCVのバグでした。最新のトランクで修正が利用可能です。

于 2012-04-26T10:08:48.157 に答える
1

このようなことをするのはどうですか?

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

ポインタを1つだけ宣言し、多くは宣言しない

于 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 に答える