2010-10-07 63 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