释放std::vector内部的Mat

Release Mat inside std::vector

本文关键字:Mat 内部 vector std 释放      更新时间:2023-10-16

使用OpenCV 2.2,我试图通过调用Mat映像的release来释放内存在std::矢量内部,例如:

std::vector < Mat > matVec;

然而,它看起来像

for (int k = 0; k < matVec.size(); k++)
{
   matVec[k].release();
}

没有释放任何内存(不过它仍在编译)。

我知道OpenCV 2.2中有新的内存管理,但我无法发现问题

使用IplImage*类型代替Mat(使用cvReleaseImage()代替Mat成员函数.release())的类似示例也可以正常工作。

有什么提示吗?

.release()只能在特殊情况下调用,不适用于日常使用。只需清除矢量:

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

这会调用每个Mat的析构函数,释放内存(如果没有其他cv::Mat指向它,请记住,与IplImage不同,cv::Mat是一个引用计数的数据类型。如果它在其他地方被引用,您也必须清除该引用)。如果您想保留矢量,但要去掉内容,请将代码中的.release()行替换为:

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

最好的方法是激活每个matVec[k]对象的析构函数。您可以让matVec脱离范围,或者将matVec定义为Mat*vector,然后手动分配和解除分配每个对象。

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