2011-05-23 37 views
3

使用OpenCV的2.2,我试图以释放内存是调用一个std ::矢量内部释放到垫图像 ,如:释放垫内的std ::矢量

std::vector <Mat> matVec; 

然而,好像

for (int k = 0; k < matVec.size(); k++) 
{ 

    matVec[k].release(); 

} 

不释放任何内存(它仍然编译,虽然)。

我知道有新的内存管理OpenCV 2.2,但我不能发现 问题。

IplImage*类型代替Mat(使用cvReleaseImage()代替Mat成员函数.release())的类似示例工作得很好。

任何提示?

回答

1

最好的办法是激活每个matVec[k]对象的析构函数。您可以通过让matVec超出范围或将matVec定义为vectorMat*并手动分配和取消分配每个对象来实现此目的。

因为OpenCV使用Mat对象的引用计数机制,所以这样总是比较安全,因此您不想直接解除分配Mat中的数据。

7

.release()只能在特殊情况下调用,不适合日常使用。只是清除载体:

std::vector<cv::Mat>().swap(matVec); 

这就要求每个Mat S的析构函数,释放内存(如果没有其他cv::Mat指向它 - 记住cv::Mat是,不像IplImage,引用计数的数据类型。如果被引用到其他地方,你也必须清除那个引用)。如果你想保留矢量,但要摆脱内容,请将代码中的.release()行替换为:

matVec[k] = cv::Mat(); 
+1

谢谢,Jacob,etarion!我感谢您的帮助。你将如何做到以下几点:假设你想将图像push_back成matVec。但是,这些图像最初是IplImage *。你将如何从IplImage *转换为Mat,以便使用您建议的方法仍然可以正确清理矢量?谢谢! – 2011-05-25 02:44:24