2010-10-07 114 views
1

我正在使用OpenCV功能:cvExtractSURF但我發現一個主要的內存泄漏。有沒有人成功實施了這個呼叫?OpenCV - cvExtractSURF導致內存泄漏?

我的代碼如下:

IplImage *cvImage = [self CreateIplImageFromUIImage:image grayscale:YES]; 

CvMemStorage* storage = cvCreateMemStorage(0); 

CvSeq *objectKeypoints = 0; 
//CvSeq *objectDescriptors = 0; 

CvSURFParams params = cvSURFParams(self.hessianThreshold, 0); 
double tt = (double)cvGetTickCount(); 

//Extract the features 
cvExtractSURF(cvImage, 0, &objectKeypoints, NULL, storage, params, 0); 

tt = (double)cvGetTickCount() - tt; 
//NSLog(@"%d features found in %gms seconds\n", objectKeypoints->total, tt/(cvGetTickFrequency()*1000.)); 

cvReleaseImage(&cvImage); 
cvReleaseMemStorage(&storage); 

任何想法在那裏,這可能被泄露?當我註釋掉該行時:

cvExtractSURF(cvImage, 0, &objectKeypoints, NULL, storage, params, 0); 

沒有泄漏發生。

+0

親愛的@ aserbin3,如果你想要做的OpenCV的社區幫忙, - 停止編輯4年的關於(當時已經)死C-API的舊文章。那些來這裏的菜鳥只會想,它仍然有效。 (它不是) – berak 2014-05-15 20:48:37

回答

3

函數cvExtractSURF創建一個CvSURFPoint類型的對象列表,並在objectKeypoints中放置一個指向它的指針。你必須釋放它。

添加呼叫...

cvRelease((void **)&objectKeypoints); 
+0

嘿,我想要綠色的複選標記。 :-) – 2010-10-08 22:35:36

+0

綠色複選標記賺得:)我實際上不得不使用cvRelease((void **)&objectKeypoints);不太確定這是爲什麼。 – Brett 2010-10-09 20:20:21

+0

對。 cvRelease通過ad hoc多態性工作,這就是爲什麼你需要演員。我懶得測試代碼,或者我會抓住這一點。我已經更新了包含演員的答案。哦。並感謝您的複選標記。 – 2010-10-10 07:31:06